Pandas: Izinkan metadata khusus untuk dilampirkan ke panel/df/seri?

Dibuat pada 11 Des 2012  ·  84Komentar  ·  Sumber: pandas-dev/pandas

terkait:
https://github.com/pydata/pandas/issues/39 (deskripsi kolom)
https://github.com/pydata/pandas/issues/686 (masalah serialisasi)
https://github.com/pydata/pandas/issues/447#issuecomment -11152782 (Permintaan fitur, varian implementasi)

Ide dan masalah:

  • apakah acar cukup stabil?
  • permintaan serialisasi berpotensi memasangkan ini dengan format penyimpanan
  • izinkan objek python sewenang-wenang?
  • impl. opsi: JSONables-only + tag tipe + muat/simpan kait panggilan balik
  • pengambil/penyetel atau akses gaya atribut (membatasi penamaan)?
  • datar atau hierarkis?
Enhancement IO Data metadata

Komentar yang paling membantu

Saya pikir kami memiliki _metadata https://pandas.pydata.org/pandas-docs/stable/development/extending.html#define -original-properties dan .attrs ditentukan untuk kasus penggunaan metadata ini . Jika ini tidak cukup mencakup kasus penggunaan yang diperlukan, masalah baru dapat dibuat tentang 2 metode tersebut. Penutupan

Semua 84 komentar

penyimpanan data ini cukup mudah diterapkan di HDFStore.
(tidak mendorong HDFStor sebagai mekanisme umum!)

pemikiran umum tentang meta data:

  • Atribut meta tunggal menghindari banyak masalah
  • pilih 'meta'
  • izinkan hierarkis
  • izinkan apa pun (misalnya tidak ada pemeriksaan)
  • apakah kamu terus menyalinnya?, hanya dangkal saya pikir
  • dalam serialisasi, buat json saja

khusus untuk HDFSstore:

  • serialisasi - (PyTables sudah memiliki persyaratan ini), mungkin minta ini meningkatkan/memperingatkan pengguna bahwa mereka akan kehilangan data
  • di HDFStore: apa yang harus dilakukan saat menambahkan (dan tidak menimpa) - mungkin mengabaikannya, dan memaksa pengguna untuk memberikan opsi, meta=True?

pytables sangat cocok dalam hal fitur, tetapi:

  • pytables saat ini bukan ketergantungan panda yang sulit.
  • saat ini tidak tersedia untuk python3?
  • tidak mendukung dalam database memori (?)
  • juga tidak bisa dengan sendirinya diasamkan atau diasinkan dengan mudah? jadi Anda harus menyematkan file hdfs biner.

oh - tidak menyarankan kami menggunakan ini sebagai backend untuk penyimpanan tertentu
meta deta secara umum (poin di atas adalah komentar saya secara umum tentang meta
data - membacanya lagi sepertinya saya mendorong HDFStore)

baru saja menunjukkan bahwa HDFStore dapat mendukung meta deta jika struktur panda melakukannya

untuk menjawab pertanyaan Anda

  • bukan ketergantungan yang sulit - panda juga tidak boleh membuatnya
  • belum py3 (sedang dikerjakan sekarang saya percaya)
  • tidak mampu dalam memori
  • hdf dimaksudkan untuk menjadi format eksternal
    (jadi harus menyertakan file terpisah)

+1 untuk semua data meta yang hidup di bawah satu atribut

Saya menentang mengizinkan objek yang tidak dapat diserialisasi sebagai metadata, sama sekali. Tapi tidak yakin
jika itu harus menjadi kendala pada objek atau format serialisasi.

dalam hal apa pun, mekanisme tag tipe kait + akan memungkinkan pengguna untuk menanam id eksternal
objek dan merekonstruksi hal-hal pada waktu buka.
Saya telah berpikir untuk menyarankan mekanisme pengait di tempat lain (untuk representasi khusus
dataframe - yaitu, html dan sebagainya).

Apakah yang Anda maksud: tidak mampu dalam memori

HDF5 memiliki penulis memori + stdout dan dukungan pytables telah ditambahkan
baru-baru ini.

(https://github.com/PyTables/PyTables/pull/173)

Pada Tue, 11 Desember 2012 di 08:31, jreback [email protected] menulis:

oh - tidak menyarankan kami menggunakan ini sebagai backend untuk penyimpanan tertentu
dari meta deta secara umum
hanya saja HDFStore dapat mendukung meta deta jika struktur panda mendukung

untuk menjawab pertanyaan Anda

  • bukan ketergantungan yang sulit - panda juga tidak boleh membuatnya
  • belum py3 (sedang dikerjakan sekarang saya percaya)
  • tidak mampu dalam memori


Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/pydata/pandas/issues/2485#issuecomment -11233812.

Oh. Saya tidak menyadarinya dan tidak menemukan apa pun di dokumen online.
Ini tampaknya telah ditambahkan setelah rilis pytables 2.4.0 terbaru dan begitu juga bukan
belum tersedia dari pypi atau distro.

Terima kasih telah menyertakan saya dalam permintaan ini yp.

IMO, sepertinya kita tidak boleh mencoba melarang objek sebagai metadata berdasarkan kapasitas serialisasinya. Saya hanya mengatakan ini karena bagaimana seseorang memperhitungkan setiap objek yang mungkin? Misalnya, plot Chaco dari Enthought Tool Suite tidak mudah dibuat bersambung, tetapi siapa yang akan tahu jika mereka tidak mencobanya. Saya pikir yang terbaik adalah membiarkan pengguna meletakkan apa pun sebagai metadata, dan jika tidak dapat membuat serial, maka mereka akan tahu ketika ada kesalahan. Juga dimungkinkan untuk membuat program membuat serial semuanya kecuali metadata, dan kemudian hanya memperingatkan pengguna bahwa aspek ini telah hilang.

Adakah yang tahu kode sumber pandas dengan cukup baik untuk memahami cara mengimplementasikan sesuatu seperti ini? Saya benar-benar tidak memiliki petunjuk, tetapi semoga ini tidak meminta terlalu banyak dari para pengembang.

Juga, saya pikir penambahan ini akan menjadi cara yang bagus untuk menenangkan orang yang selalu mencari subkelas kerangka data.

*suara naik untuk menambahkan atribut yang disebut 'meta'
*suara naik untuk meletakkannya di kelas Indeks serta Seri, DataFrame, dan Panel

Terakhir kali saya periksa, HDF5 memiliki batasan ukuran AttributeSet. Saya harus menyiasatinya dengan meminta objek toko saya merangkum direktori, dengan .h5 dan objek meta acar.

Saya pikir menambahkan metadata ke objek DataFrame mengharuskannya membuat serial dan bekerja dengan semua backend (acar, hdf5, dll). Yang mungkin berarti membatasi jenis metadata yang dapat ditambahkan. Ada kasus sudut untuk pengawetan kelas khusus yang akan menjadi masalah panda.

Halo kawan-kawan. Aku sedikit penasaran tentang sesuatu. Perbaikan ini saat ini menangani penambahan atribut khusus ke kerangka data. Nilai-nilai atribut ini, mereka bisa menjadi fungsi python bukan? Jika demikian, ini mungkin solusi untuk menambahkan metode instans kustom ke kerangka data. Saya tahu beberapa orang di masa lalu ketika tertarik dengan kemungkinan ini.

Saya pikir cara ini bisa bekerja adalah kerangka data harus memiliki metode baru, sebut saja ... Saya tidak tahu, add_custom_method(). Ini akan mengambil fungsi, lalu menambahkan fungsi ke kamus atribut 'meta', dengan semacam penelusuran balik untuk memberi tahu program bahwa itu istimewa.

Ketika mesin baru yang diusulkan menetapkan atribut khusus ke kerangka data baru, mungkin juga tepat untuk secara otomatis mempromosikan fungsi tersebut ke metode instans. Jika bisa melakukan itu, maka kita akan memiliki cara untuk secara efektif mensubklasifikasikan DataFrame tanpa benar-benar melakukannya.

Ini mungkin berlebihan untuk putaran pertama yang pertama, tetapi mungkin sesuatu untuk dipikirkan di kemudian hari.

@dalejung apakah Anda memiliki tautan ke batas AttributeSet?
@hugadams Anda cukup menambal monyet jika Anda menginginkan metode contoh khusus

import pandas
def my_func(self, **kwargs):
    return self * 2
pandas.DataFrame.my_func = myfunc

@jreback : Terima kasih telah menunjukkan ini kepada pria. Saya pernah mendengar tentang metode instance monkeypatching, tetapi selalu berpikir itu lebih merupakan bahasa sehari-hari untuk sesuatu yang lebih sulit.

Terima kasih telah menunjukkan ini padaku.

@jreback http://www.hdfgroup.org/HDF5/doc/UG/13_Attributes.html#SpecIssues mungkin? Sudah lama dan bisa jadi pytables belum mengimplementasikan fitur HDF5 baru.

Secara pribadi, saya memiliki dataset dengan ~40k item metadata. Tidak ada yang rumit, hanya besar. Jauh lebih mudah untuk mengasinkan hal-hal itu secara terpisah dan menggunakan HDF untuk data aktual.

@dalejung terima kasih atas tautannya .... Saya tidak yakin dengan kasus penggunaan untuk meta data di luar struktur sederhana .... jika Anda memiliki data biasa, Anda selalu dapat menyimpan sebagai struktur atau acar terpisah atau apa pun ....

@hugadams np....semoga sukses

@jreback tentu, tapi itu semacam keadaan sekarang. Anda dapat menggunakan DataFrames sebagai atribut kelas khusus. Anda dapat melacak metadata Anda secara terpisah.

Maksud saya adalah bahwa akan ada harapan agar serialisasi metadata DataFrame berfungsi. Batas HDF5 lebih buruk karena didasarkan pada ukuran dan bukan jenis, yang berarti dapat bekerja sampai tiba-tiba tidak.

Akan selalu ada kasus penggunaan yang tidak kami pikirkan. Menambahkan atribut metadata yang terkadang disimpan akan menimbulkan masalah.

@dalejung ok...setelah PR GH #2497 ini digabungkan, Anda dapat mencoba ini dengan cara yang terbatas (terbatas karena bingkai data tidak 'belum' menyebarkan ini). bisa menangkap kesalahan jika Anda mencoba menyimpan terlalu banyak (tidak banyak yang harus dilakukan dalam hal ini KECUALI gagal)

Sepertinya pro dan kontra dari masalah serialisasi yang sulit sudah jelas.

Inilah masalah pelik lainnya - apa semantik menyebarkan meta melalui operasi?

df1.meta.observation_date = "1/1/1981"
df1.meta.origin = "tower1"
df2.meta.observation_date = "1/1/1982"
df2.meta.origin = "tower2"

df3=pd.concat(df1,df2)
# or merge, addition, ix, apply, etc'

Sekarang, apa meta "benar" untuk df3?

  • selain memuat/menyimpan, pengguna biasanya melakukan operasi pada kerangka data. Jika sebagian besar operasi (kombinasi,
    mutasi, slicing...) membatalkan semua meta tag (yaitu membuat mereka salah atau menjatuhkan mereka sepenuhnya), apa
    kasus penggunaan metadata yang tersisa?
  • Jika kita mulai mendefinisikan aljabar untuk menggabungkan meta, ini mungkin menjadi terlalu rumit
    menjadi menarik.

Saya akan tertarik untuk mendengar contoh spesifik dari masalah yang Anda harap akan diselesaikan untuk Anda,
apa jenis meta tag yang Anda inginkan untuk pekerjaan Anda?

`

@yp Saya setuju bahwa logika propagasi menjadi miring. Dari pengalaman, apakah akan menyebarkan meta1/meta2/tidak ada yang spesifik untuk situasi dan tidak mengikuti aturan apa pun.

Mungkin kebutuhan metadata akan dipenuhi dengan alat komposisi yang lebih mudah? Misalnya, saya cenderung mendelegasikan panggilan atribut ke kerangka data anak dan juga menghubungkan repr/str. Ada kemudahan tertentu yang diberikan panda agar Anda kalah dengan komposisi sederhana.

Memikirkannya, api seperti array numpy mungkin berguna untuk memungkinkan kelas komposisi menggantikan DataFrames.

Hai yp. Anda mengemukakan poin yang sangat bagus sehubungan dengan penggabungan. Pikiran saya adalah bahwa jumlah gabungan yang berbagi kunci harus menyimpan hasil dalam Tuple, alih-alih menimpa; Namun, ini masih situasi yang tidak menguntungkan.

Anda tahu, setelah penambalan monyet dijelaskan kepada saya oleh jreback, saya menyadari bahwa kemungkinan besar saya bisa mendapatkan semua fungsi yang saya cari dalam atribut khusus. Mungkin apa yang akan lebih membantu saat ini, daripada atribut khusus, adalah tutorial kecil di halaman utama tentang cara menambal monyet dan menyesuaikan Struktur Data panda.

Dalam situasi pribadi saya, saya tidak lagi merasa bahwa metadata khusus akan benar-benar membuat atau menghancurkan proyek saya jika patch monyet memadai; namun, kalian tampaknya memiliki gambaran yang lebih baik tentang panda, jadi saya pikir itu benar-benar keputusan penilaian Anda jika pro metadata baru akan lebih besar daripada kontra.

Terima kasih atas semua idenya, inilah ringkasan saya:

  1. Mungkin berguna untuk melampirkan metadata ke file bersambung sebagai lawan dari objek langsung.
  2. orang ingin memperluas _fungsi_ dengan cara alami, daripada menambahkan meta data ,
    bahkan jika tidak masuk akal untuk memilikinya sebagai bagian dari hulu.
    monkey-patching adalah idiom yang berguna untuk itu. Saya menggunakannya sendiri di file startup IPython saya.
    (#2530)
  3. Mengizinkan metadata sewenang-wenang ditambahkan ke objek langsung tidak masuk akal saat mutasi
    pasti terlibat. tag metadata yang terdefinisi dengan baik terikat baik untuk domain tertentu,
    atau cocok untuk "dipanggang" ketika cukup umum.
  4. Mungkin ada kebutuhan yang ada untuk format file "wadah data ilmiah", mungkin:
    dirancang oleh panitia selama beberapa tahun, menghasilkan standar 250 halaman dengan nama seperti
    IKF-B76/J-2017, tidak diadopsi oleh siapa pun di luar komunitas laboratorium penelitian energi DOD AS.
    panda bukan itu.

Menjatuhkan tonggak untuk saat ini tetapi akan dibiarkan terbuka jika seseorang memiliki lebih banyak untuk ditambahkan.
jika Anda membutuhkan (1), silakan buka masalah dan jelaskan kasus penggunaan Anda.

Hei ya. Terima kasih telah membiarkan ini terbuka. Ternyata penambalan monyet tidak menyelesaikan masalah saya seperti yang saya kira.

Ya, patching monyet memungkinkan seseorang untuk menambahkan metode dan atribut instans kustom ke kerangka data; namun, fungsi apa pun yang menghasilkan kerangka data baru tidak akan mempertahankan nilai atribut khusus ini.

Dari email yang saat ini ada di milis:

import pandas

pandas.DataFrame.test=None

df=pandas.DataFrame(name='Bill')
df.name
>>> 'Bill'

df2=df.mul(50)
df2.name
>>>

Saya telah menyusun kerangka data khusus untuk spektroskopi yang sangat ingin saya tempatkan di tengah paket spektroskopi baru; namun, menyadari bahwa setiap operasi yang mengembalikan kerangka data baru menyetel ulang semua atribut khusus saya. Metode instance dan slot untuk atribut dipertahankan, jadi ini lebih baik daripada tidak sama sekali, tetapi masih akan menghambat program saya.

Satu-satunya solusi yang dapat saya temukan adalah menambahkan semacam fungsi transfer atribut ke setiap metode kerangka data tunggal yang ingin saya kerjakan dengan kerangka data khusus saya. Dengan demikian, inti dari membuat objek saya menjadi kerangka data khusus hilang.

Dengan pemikiran ini, saya pikir patching monyet tidak memadai kecuali ada solusi yang tidak saya sadari. Akan melihat apakah ada yang membalas di milis.

@hugadams Anda mungkin jauh lebih baik untuk membuat kelas untuk menampung frame dan meta dan kemudian meneruskan metode yang diperlukan untuk menangani manipulasi ... sesuatu seperti

class MyObject(object):

   def __init__(self, df, meta):
         self.df = df
         self.meta = meta

   <strong i="7">@property</strong>
    def ix(self):
          return self.df.ix

tergantung pada apa yang sebenarnya perlu Anda lakukan, berikut ini akan berhasil:

o = MyObject(df, meta)
o.ix[:,'foo'] = 'bar'
o.name = 'myobj'

dan kemudian Anda dapat menyesuaikan serialisasi, pembuatan objek, dll
acara Anda dapat memungkinkan getattr untuk secara otomatis meneruskan metode ke df/meta sesuai kebutuhan

hanya menjadi rumit ketika Anda melakukan mutasi

o.df = o.df * 5

anda bahkan dapat menangani ini dengan mendefinisikan __mul__ di MyObject

Anda mungkin memiliki serangkaian operasi terbatas yang benar-benar ingin Anda dukung, pengguna yang kuat dapat melakukannya
menjangkau dan ambil o.df jika mereka perlu...

hth

@jreback

Terima kasih atas masukannya. Saya pasti akan mengingat hal ini jika ide metadata dari utas ini tidak pernah membuahkan hasil, karena tampaknya ini adalah cara terbaik untuk maju. Apakah Anda tahu begitu saja bagaimana saya bisa menerapkan pemotongan langsung misalnya:

o['col1'] bukan o.df['col1']

Saya tidak yakin bagaimana cara mentransfer fungsionalitas itu ke objek khusus saya tanpa panggilan langsung ke kerangka data yang mendasarinya.

Terima kasih telah menunjukkan definisi ulang mul . Ini akan membantu saya ke depan.

Ini benar-benar terasa seperti solusi bundaran untuk ketidakmampuan Dataframe untuk disubklasifikasikan. Terutama jika objek kustom saya berevolusi dengan panda, ini akan membutuhkan pemeliharaan agar tetap disinkronkan dengan perubahan pada Dataframe API.

Bagaimana jika kita melakukan ini- Menggunakan contoh jreback, kita membuat kelas generik dengan tujuan khusus untuk disubklasifikasikan untuk penggunaan khusus? Kami dapat menyertakan metode Dataframe yang paling umum dan memperbarui semua operator yang sesuai. Kemudian, orang bodoh yang putus asa seperti saya yang datang dengan niat untuk menyesuaikan memiliki titik awal yang sangat kuat.

Saya pikir potensi penuh panda belum diakui oleh komunitas peneliti, dan mengantisipasinya akan menyebar ke lebih banyak bidang ilmiah. Dengan demikian, jika kita dapat menyajikan kelas generik untuk menyesuaikan kerangka data, peneliti mungkin lebih cenderung membangun paket di sekitar panda, daripada membuat struktur data ad-hoc mereka sendiri.

Hanya ada beberapa metode yang mungkin perlu Anda khawatirkan, bagaimanapun Anda selalu dapat mengakses df
misalnya aritmatika, getitem, setitem,ix, mungkin boolean

tergantung pada apa yang Anda ingin pengguna dapat lakukan dengan objek Anda
python adalah semua tentang kejutan. sebuah objek harus melakukan apa yang Anda harapkan; dalam hal ini kamu adalah
memiliki objek Anda seperti DataFrame dengan atribut tambahan, atau apakah Anda benar-benar melakukan hal-hal yang lebih kompleks seperti mendefinisikan ulang cara kerja operator?

misalnya Anda dapat mendefinisikan ulang * menjadi call my cool multiplier function , dan dalam beberapa bidang ini masuk akal (misalnya analisis domain frekuensi Anda ingin * berarti konvolusi)

dapatkah Anda memberikan contoh apa yang Anda coba lakukan?

# to provide: o['col1'] access

def __getitem__(self, key):

     # you could intercept calls to metadata here for example
      if key in meta:
           return meta[key]

     return self.df.__getitem__(self, key)

Yang saya lakukan hanyalah membuat kerangka data untuk data spektral. Dengan demikian, ia memiliki tipe indeks khusus yang saya tulis bernama "SpecIndex" dan beberapa metode untuk mengubah dirinya menjadi berbagai representasi data. Ini juga memiliki metode khusus untuk memperluas bagaimana data temporal dikelola. Bagaimanapun, operasi ini terkandung dengan baik dalam versi tambalan monyet saya, dan juga akan dengan mudah diimplementasikan dalam formalisme kelas baru seperti yang Anda tunjukkan.

Setelah ini, itu benar-benar harus dukun. Selain fungsi dan atribut spektroskopi ini, ia harus berperilaku seperti kerangka data. Oleh karena itu, operasi paling umum pada kerangka data, saya lebih suka menjadi tidak terlihat dan mempromosikan metode instan. Saya ingin mendorong pengguna untuk mempelajari panda dan menggunakan alat ini untuk spektroskopi eksplorasi . Karena itu, saya mencoba untuk mencegat inkonsistensi sebelumnya seperti yang Anda tunjukkan tentang o.df=o.df * 5. Apakah saya harus mengubah perilaku semua operator dasar (mis. * / + -) atau hanya *? Peringatan apa pun seperti ini, saya ingin koreksi sebelumnya. Pada akhirnya, saya ingin lapisan kelas itu sendiri menjadi tidak terlihat mungkin.

Apakah ada lagi gotcha ini yang muncul di benak Anda?

Yang terbaik adalah memikirkan objek Panda seperti Anda melakukan bilangan bulat. Jika Anda memiliki objek Orang hipotetis, tingginya hanya akan berupa angka. Angka itu tidak akan tahu itu ketinggian atau unit apa. Itu hanya ada untuk operasi numerik. height / height_avg tidak peduli dengan jenis kelamin, berat badan, atau ras orang tersebut.

Saya pikir ketika DataFrame adalah objek data utama, ini tampak aneh. Tetapi bayangkan bahwa objek Person memiliki atribut weight_history. Tidak masuk akal untuk mensubklasifikasikan DataFrame untuk menyimpan atribut itu. Apalagi jika objek Panda lainnya ada di data Person.

subclassing/metadata akan selalu mengalami masalah saat melakukan analisis eksplorasi. Apakah SubDataFrame.tail() mengembalikan SubDataFrame? Jika ya, apakah itu akan mempertahankan atribut yang sama? Apakah kita ingin membuat salinan dict untuk semua operasi seperti +/-*?

Setelah titik tertentu menjadi jelas bahwa Anda tidak bekerja dengan Person atau SpectralSeries. Anda sedang mengerjakan int atau DataFrame. Dengan cara yang sama bahwa convert_height(Person person) tidak lebih nyaman daripada convert_height(int height) , membawa pengguna Anda ke dalam pola pikir bahwa DataFrame hanyalah tipe data akan lebih sederhana dalam jangka panjang. Terutama jika kelas Anda menjadi lebih rumit dan perlu menampung lebih dari satu objek Pandas.

@hugadams Saya sarankan melihat berbagai tes di pandas/tests/test_frame.py, dan membuat suite pengujian Anda sendiri. Anda dapat memulai dengan menggunakan objek seperti 'DataFrame' Anda dan melihat apa yang rusak (jelas sebagian besar hal akan rusak di awal). Kemudian lewati tes dan/atau perbaiki hal-hal saat Anda pergi.

Anda mungkin ingin mengubah sebagian besar operasi aritmatika (misalnya * / + - ), misalnya apa pun yang Anda ingin agar dapat dilakukan oleh pengguna.

@hugadams Jika Anda ingin melihat upaya lama yang funky dalam http://nbviewer.ipython.org/4238540/

Ini quasi berfungsi karena hampir semua metode ajaib DataFrame memanggil metode lain, ini dicegat di getattribute dan dialihkan ke SubDF.df.

Terima kasih untuk semua bantuan teman-teman. Saya pikir setuju bahwa mungkin subclassing akan membuat saya mendapat masalah, dan terima kasih telah berbagi contoh.

Saya akan mencoba implementasi jreback, tetapi bolehkah saya menanyakan satu hal terakhir?

Satu-satunya alasan saya menginginkan perilaku/subkelas khusus adalah karena saya ingin atribut khusus saya tetap ada setelah operasi pada kerangka data. Melihat contoh subkelas ini, membuat saya percaya bahwa jika mungkin tidak begitu sulit untuk mengubah metode yang benar sehingga beberapa atribut tetap baru ini ditransfer ke kerangka data baru yang dibuat dari metode instans atau operasi umum. Maksud saya, kerangka data sudah mempertahankan nilai atributnya saat mutasi. Seberapa sulitkah untuk menambahkan beberapa atribut baru saya ke dalam mesin ini? Sepertinya ini mungkin kurang berhasil daripada membangun kelas yang sama sekali baru hanya untuk menyimpan atribut. (Metode Instance dapat ditambal oleh monyet).

@dalejung , dalam kasus paling sederhana, jika yang ingin saya lakukan hanyalah menambahkan atribut "nama" ke kerangka data, sehingga nilainya akan tetap ada setelah melakukan:

df=df*5

atau

df=df.apply( somfunc )

Apakah ini akan menjadi peretasan yang mudah ke sumber yang Anda berikan?

@hugadams 'has-a' memungkinkan atribut khusus Anda tetap ada terlepas dari perubahan pada df
atau lebih tepatnya, ubah ketika Anda ingin mereka berubah
(dan, sebagai tambahan, katakanlah Anda menerapkan kegigihan berbasis disk, maka ini akan mudah)

umumnya saya menggunakan 'is-a' hanya ketika saya benar-benar membutuhkan tipe khusus

ketika Anda membutuhkan sedikit dari keduanya, Anda dapat melakukan campuran (tidak menganjurkan itu di sini karena ini menjadi lebih rumit!)

@jreback

Nah, kerangka data tambalan monyet saya saat ini sudah berfungsi dan menetapkan atribut secara konsisten. Oleh karena itu, satu-satunya masalah yang saya miliki adalah bahwa nilai atribut ini hilang di bawah operasi yang mengembalikan kerangka data baru. Dari apa yang saya pelajari saat itu, solusi terbaik saya adalah menggunakan objek ini apa adanya, lalu menerapkan perilaku 'memiliki-a' yang Anda sebutkan.

Saya minta maaf karena sangat tidak berdaya, tetapi dapatkah Anda menguraikan atau memberikan contoh tentang apa yang Anda maksud dengan 'memiliki-a'? Saya tidak melihat di mana dalam kode sumber Dataframe ini digunakan.

@hugadams 'has-a' hanyalah nama lain untuk kelas container yang saya jelaskan di atas, 'is-a' adalah sublcassing

@jreback Ok, terima kasih

@hugadams Itu bisa mempertahankan .name jika Anda mentransfer dalam bungkus. tetapi akan ada kasus sudut di mana ini akan rusak. Sejujurnya, itu bukan jalan yang berharga untuk turun. Jauh lebih baik menggunakan komposisi dan menjaga DataFrame sebagai entitas yang terpisah.

@dalejung

Terima kasih. Saya akan mencoba menggunakan komposisi.

Berikut cara yang salah untuk melakukannya:

In [1]: import pandas as pd
   ...: def hook_class_init(cls):
   ...:     def f(self,*args,**kwds):
   ...:         from inspect import currentframe
   ...:         f.__orig_init__(self,*args,**kwds)
   ...:         obj = currentframe().f_back.f_locals.get('self')
   ...:         if isinstance(obj,self.__class__) and hasattr(obj,"meta"):
   ...:             setattr(self,"meta",getattr(obj,'meta'))  
   ...:     if not hasattr(cls.__init__,"__orig_init__"):
   ...:         f.__orig_init__ = cls.__init__
   ...:         cls.__init__=f
   ...: 
   ...: def unhook_class_init(cls):
   ...:     if hasattr(cls.__init__,"__orig_init__"):
   ...:         cls.__init__=cls.__init__.__orig_init__

In [2]: hook_class_init(pd.DataFrame)
   ...: df1=mkdf(10,4)
   ...: df1.meta=dict(name="foo",weight="buzz")
   ...: x=df1.copy()
   ...: print x.meta
{'name': 'foo', 'weight': 'buzz'}

In [3]: unhook_class_init(pd.DataFrame)
   ...: x=df1.copy()
   ...: print x.meta
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-ed39e9901bfc> in <module>()
      1 unhook_class_init(pd.DataFrame)
      2 x=df1.copy()
----> 3 print x.meta

/home/user1/src/pandas/pandas/core/frame.pyc in __getattr__(self, name)
   2020             return self[name]
   2021         raise AttributeError("'%s' object has no attribute '%s'" %
-> 2022                              (type(self).__name__, name))
   2023 
   2024     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'meta'

Terima kasih yp.

Ya, saya mulai melihat jumlah peretasan yang diperlukan untuk melakukan sesuatu seperti ini. Saya akan tetap menggunakan metode komposisi.

Jadi saya sudah bermain dengan hal-hal subclassing/komposisi.

https://github.com/dalejung/trtools/blob/master/trtools/tools/composition.py

Kasus penggunaan sederhana yang saya gunakan adalah kumpulan data kembali. Saya memiliki ReturnFrame/ReturnSeries dengan atribut/metode untuk bekerja secara khusus pada pengembalian. Sejauh ini, tampaknya berguna jika hanya untuk menyelamatkan saya dari mengetik (1+pengembalian) begitu sering. Seperti yang diharapkan, saya mengalami masalah metadata di mana sesuatu seperti type(returns > .01) == ReturnSeries # true terjadi yang tidak masuk akal.

Saya juga mengalami masalah di mana DataFrame akan kehilangan kelas/metadata seri saat ditambahkan. Saya harus membuat subkelas yang dengan bodohnya menyimpan kelas/metadata dalam dicts dan membungkus ulang pada akses attr/item.

https://github.com/dalejung/trtools/blob/master/trtools/core/dataset.py

Sudah beberapa hari dan saya belum mengalami masalah nyata di luar awalnya tidak memahami api numpy. Namun, mensubklasifikasikan pd.DataFrame, meskipun diperlukan untuk mengelabui panda agar menerima kelas, membuat semuanya berantakan dan memerlukan penggunaan __getattribute__ untuk memastikan saya membungkus data yang dikembalikan.

Saya mulai berpikir bahwa memiliki __dataframe__ api akan menjadi pilihan yang baik. Itu akan memungkinkan kelas komposisi untuk mendapatkan banyak penggunaan kembali dan kesederhanaan subkelas sambil menghindari komplikasi. Mendukung subclassing tampaknya seperti komitmen terbuka untuk panda. Namun, memiliki dataframe api akan memungkinkan kelas khusus untuk dengan mudah terhubung ke panda sambil mempertahankan kontrak yang hanya diketahui dan ditangani pandas.DataFrames.

Hai dalejung. Ini terlihat cukup keren. Sedang berlibur jadi tidak bisa bermain dengannya tapi
dapatkah Anda menjelaskan dengan tepat apa yang Anda maksud dengan dataframe api? Apakah maksudmu?
api untuk menyesuaikan kerangka data atau apakah saya salah paham?
Pada 31 Des 2012 11:18, "dalejung" [email protected] menulis:

Jadi saya sudah bermain dengan hal-hal subclassing/komposisi.

https://github.com/dalejung/trtools/blob/master/trtools/tools/composition.py

Kasus penggunaan sederhana yang saya gunakan adalah kumpulan data kembali. saya sudah
ReturnFrame/ReturnSeries dengan atribut/metode untuk bekerja secara khusus pada
kembali. Sejauh ini, tampaknya berguna jika hanya untuk menyelamatkan saya dari mengetik
(1+pengembalian) begitu sering. Seperti yang diharapkan, saya mengalami masalah metadata di mana
sesuatu seperti type(returns > .01) == ReturnSeries # true terjadi yang
tidak masuk akal.

Saya juga mengalami masalah di mana DataFrame akan kehilangan seri
kelas/metadata saat ditambahkan. Saya harus membuat subclass yang dengan bodohnya menyimpan
kelas/metadata dalam dicts dan bungkus ulang pada akses attr/item.

https://github.com/dalejung/trtools/blob/master/trtools/core/dataset.py

Sudah beberapa hari dan saya belum mengalami masalah nyata di luar
awalnya tidak memahami api numpy. Namun, mensubklasifikasikan
pd.DataFrame, sementara diperlukan untuk mengelabui panda agar menerima kelas,
membuat segalanya berantakan dan membutuhkan penggunaan _getattribute_ untuk memastikan saya
membungkus data kembali.

Saya mulai berpikir bahwa memiliki _dataframe_ api akan bagus
pilihan. Itu akan memungkinkan kelas komposisi untuk mendapatkan banyak penggunaan kembali dan
kesederhanaan subclassing sambil menghindari komplikasi. mendukung
subclassing sepertinya komitmen terbuka untuk panda. Namun, memiliki
api dataframe akan memungkinkan kelas khusus untuk dengan mudah terhubung ke panda sementara
mempertahankan kontrak yang hanya diketahui dan ditangani panda
pandas.DataFrames.


Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/pydata/pandas/issues/2485#issuecomment -11779697.

Halo kawan-kawan,

Saya perhatikan bahwa salah satu cara untuk mengambil banyak perilaku kerangka data adalah dengan menimpa panggilan getattr . MISALNYA:

kelas Foo (objek):

  def __init__(self):
      self.df=DataFrame([1,2,3],[3,4,5])

   def __getattr__(self, attr):
       return getattr(self.df, attr)    

   def __getitem__(self, key):
       ''' Item lookup'''
       return self.df.__getitem__(key)     

Dengan cara ini, banyak metode dan atribut penting dari kerangka data (seperti ix, apply, shape) tampaknya hanya berfungsi di luar kotak pada objek Foo saya. Ini menghemat banyak upaya manual dalam mempromosikan atribut dan metode yang ingin saya kerjakan secara langsung di Foo. Apakah kalian mengantisipasi kesalahan atau masalah besar yang bisa ditimbulkan ini?

Saya hanya ingin menambahkan ke utas ini bahwa saya memasukkan permintaan tarik untuk kelas komposisi yang mencoba meniru kerangka data dengan cara yang paling umum mungkin.

https://github.com/pydata/pandas/pull/2695

Meskipun saya perhatikan implementasi DaleJung mungkin bekerja lebih baik, tetapi saya tidak dapat mengujinya karena saya mendapatkan kesalahan dengan banyak tracebook:

AttributeError: objek 'modul' tidak memiliki atribut 'BufferedIOBase'
File "/home/hugadams/Desktop/trttools/trtools-master/trtools/tools/composition.py", baris 4, di
impor panda sebagai pd
File "/usr/local/EPD/lib/python2.7/site-packages/pandas/ init .py", baris 27, di
dari pandas.core.api impor *
File "/usr/local/EPD/lib/python2.7/site-packages/pandas/core/api.py", baris 13, di
dari pandas.core.series import Series, TimeSeries
File "/usr/local/EPD/lib/python2.7/site-packages/pandas/core/series.py", baris 3120, di
impor pandas.tools.plotting sebagai _gfx
File "/usr/local/EPD/lib/python2.7/site-packages/pandas/tools/plotting.py", baris 21, di
impor pandas.tseries.converter sebagai konv
File "/usr/local/EPD/lib/python2.7/site-packages/pandas/tseries/converter.py", baris 7, di
impor matplotlib.units sebagai unit
File "/usr/local/EPD/lib/python2.7/site-packages/matplotlib/__init__.py", baris 151, di
dari impor matplotlib.rcsetup (defaultParams,
File "/usr/local/EPD/lib/python2.7/site-packages/matplotlib/rcsetup.py", baris 20, di
dari matplotlib.colors impor is_color_like
File "/usr/local/EPD/lib/python2.7/site-packages/matplotlib/colors.py", baris 54, di
impor matplotlib.cbook sebagai cbook
File "/usr/local/EPD/lib/python2.7/site-packages/matplotlib/cbook.py", baris 11, di
impor gzip
File "/usr/local/EPD/lib/python2.7/gzip.py", baris 36, di
kelas GzipFile(io.BufferedIOBase):

DaleJung, jika Anda akan terus mengerjakan ini di masa mendatang, dapatkah Anda memberi tahu saya ([email protected])? Saya tidak ingin mengajukan permintaan tarik saya jika solusi Anda ternyata lebih masuk akal.

Terima kasih.

Kesalahan itu terlihat seperti masalah direktori kerja. Kemungkinan direktori io saya mengosongkan terlebih dahulu modul io dasar. Coba impor dari direktori lain?

Kelas komposisi adalah sesuatu yang saya gunakan secara aktif dan akan saya perbarui saat saya mengalami masalah. Kenyataannya adalah bahwa ini adalah peretasan yang lengkap. Saya akan berhati-hati dalam mempromosikan penggunaannya tanpa mengetahui secara internal apa yang dilakukannya untuk menyamar sebagai DataFrame.

Terima kasih dalejung. Saya akan mencoba membuatnya bekerja.

Apakah Anda memiliki file di sini yang menjalankan serangkaian tes pada objek Anda, seperti yang disebutkan? Jika demikian, apakah Anda keberatan jika saya meminjamnya dan mencoba menjalankan beberapa tes pada implementasi saya? Anda mengatakan bahwa milik Anda benar-benar diretas. Saya tidak berpikir retakan saya pada itu selalu merupakan peretasan, tetapi mungkin tidak optimal, jika itu masuk akal.

Saya mulai lebih banyak menggunakan subclass akhir-akhir ini, jadi saya memindahkannya ke proyek terpisah.

https://github.com/dalejung/pandas-composition

Saya menulis lebih banyak cakupan tes. Saya biasanya membuat subkelas untuk jenis data yang sangat spesifik sehingga pengujian saya sehari-hari dibatasi.

http://nbviewer.ipython.org/5864433 adalah jenis barang yang saya gunakan untuk itu.

Terima kasih telah memberi tahu saya Dale.

Saya di scipy, dan di salah satu simposium, beberapa orang benar-benar
tertarik pada kemampuan untuk mensubklasifikasikan kerangka data. Apakah Anda pikir ini akan?
digabung menjadi rilis mendatang, atau akan dipisahkan dari repo utama?

Ini mungkin lebih baik diterapkan daripada solusi kerja saya, jadi lihat
maju untuk itu.

Pada Selasa, 25 Juni 2013 pukul 23:18, dalejung [email protected] menulis:

Saya sudah mulai lebih banyak menggunakan subclass akhir-akhir ini dan jadi saya memindahkannya
ke proyek terpisah.

https://github.com/dalejung/pandas-composition

Saya menulis lebih banyak cakupan tes. Saya biasanya subclass untuk tipe yang sangat spesifik
data sehingga pengujian saya sehari-hari dibatasi.

http://nbviewer.ipython.org/5864433 adalah jenis barang yang saya gunakan untuk itu.


Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/pydata/pandas/issues/2485#issuecomment -20026359
.

Tampaknya tidak masuk akal untuk jujur. Sementara saya mencoba membuatnya sekuat mungkin, pandas-composition bekerja seperti yang saya pikir seharusnya. Keputusan seperti

  • apakah akan menyebarkan meta-data
  • apakah df['name'] = s harus menimpa s.name
  • tidak mendukung HDF5 secara langsung.

mudah dibuat untuk kasus penggunaan saya. Ini adalah keputusan yang harus dipikirkan dengan lebih baik jika disertakan dalam pandas . Ada alasan mengapa itu belum dimasukkan sejauh ini.

Ambil hdf5 misalnya. Saya memilih untuk menyimpan data numerik dalam hdf5 dan metadata secara terpisah. Jadi ini berfungsi lebih seperti bundel di MacOSX. Anda tidak akan mendapatkan subkelas dari hdf5 , Anda hanya akan mendapatkan DataFrame.

Plus, saya masih berpikir akan lebih baik untuk membuat dataframe api di mana sebuah kelas dapat mengekspos representasi DataFrame untuk operasi panda. Jadi, alih-alih memeriksa isinstance(obj, DataFrame) dan beroperasi pada obj , kami akan memeriksa __dataframe__ , menyebutnya, dan beroperasi pada pengembaliannya.

Itu akan membuat komposisi menjadi sederhana.

Saya melihat apa yang Anda katakan. Inilah solusi yang cukup diretas yang saya akhiri
up menggunakan untuk paket spektroskopi saya.

https://github.com/hugadams/pyuvvis/blob/master/pyuvvis/pandas_utils/metadframe.py

Ini pada dasarnya membebani operator sebanyak mungkin, dan menunda atribut
panggilan ke objek df yang mendasari yang disimpan di kelas komposit.
Ini semi-retas karena saya baru saja mencoba membebani dan mengarahkan ulang sampai setiap
operasi yang saya gunakan dalam penelitian saya berhasil. Jika Anda dapat memberikan apapun
umpan balik, terutama konstruktif, pada implementasinya atau desain yang jelas
kekurangan, saya akan sangat menghargai.

(Juga, ini disebut MetaDataFrame, tapi saya menyadari ini adalah pilihan yang buruk
nama.)

Di Scipy tahun ini, panda cukup populer. Saya bisa merasakannya tumpah
ke domain lain, dan orang-orang menghadapi masalah yang sama dengan kami
adalah. Lebih banyak orang sudah mulai menerapkan solusi mereka sendiri. Saya
merasa bahwa inilah saatnya setidaknya memberi orang-orang ini permulaan
titik akan benar-benar diterima dengan baik. Bahkan jika kita mengakui bahwa mereka akan
perlu menyesuaikan, dan itu tidak akan menjadi bagian dari panda, alangkah baiknya jika
sesuatu untuk memulai. Paling tidak, memiliki paket kecil dan
beberapa dokumen yang mengatakan "inilah cara kami menerapkannya dan ini semua peringatannya"
akan menjadi titik awal yang bagus bagi orang lain yang ingin menyesuaikan data panda
struktur.

Pada Kam, 27 Jun 2013 jam 19:24, dalejung [email protected] menulis:

Tampaknya tidak masuk akal untuk jujur. Sementara saya mencoba membuatnya sekuat
mungkin, komposisi panda bekerja seperti yang saya pikir seharusnya. Keputusan
Suka

  • apakah akan menyebarkan meta-data
  • apakah df['name'] = s harus menimpa s.name
  • tidak mendukung HDF5 secara langsung.

mudah dibuat untuk kasus penggunaan saya. Ini adalah keputusan yang harus
lebih baik dipikirkan jika termasuk dalam panda. Ada alasan mengapa tidak
telah dimasukkan sejauh ini.

Ambil hdf5 misalnya. Saya memilih untuk menyimpan data numerik dalam hdf5 dan metadata secara terpisah. Jadi ini berfungsi lebih seperti bundel di MacOSX. Anda
tidak akan mendapatkan subkelas dari hdf5, Anda baru saja mendapatkan DataFrame.

Plus, saya masih berpikir akan lebih baik untuk membuat api dataframe tempat kelas
dapat mengekspos representasi DataFrame untuk operasi panda. Jadi alih-alih
memeriksa isinstance(obj, DataFrame) dan beroperasi pada obj, kami akan memeriksa
dataframe , sebut saja, dan operasikan saat kembali.

Itu akan membuat komposisi menjadi sederhana.


Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/pydata/pandas/issues/2485#issuecomment -20163856
.

baik, permulaan dapat mendefinisikan serangkaian fungsi seperti yang @cpcloud
diabstraksikan saat membersihkan data.py ( is_dataframe , is_series ,
is_panel ...dll.) yang kemudian dapat diganti/diubah dengan lebih mudah daripada
satu ton cek isinstance di semua tempat.

Pada Kam, 27 Jun 2013 jam 20:48, Adam Hughes [email protected] menulis :

Saya melihat apa yang Anda katakan. Inilah solusi yang cukup diretas yang saya akhiri
up menggunakan untuk paket spektroskopi saya.

https://github.com/hugadams/pyuvvis/blob/master/pyuvvis/pandas_utils/metadframe.py

Ini pada dasarnya membebani operator sebanyak mungkin, dan menunda atribut
panggilan ke objek df yang mendasari yang disimpan di kelas komposit.
Ini semi-retas karena saya baru saja mencoba membebani dan mengarahkan ulang sampai setiap
operasi yang saya gunakan dalam penelitian saya berhasil. Jika Anda dapat memberikan apapun
umpan balik, terutama konstruktif, pada implementasinya atau yang jelas
desain
kekurangan, saya akan sangat menghargai.

(Juga, ini disebut MetaDataFrame, tapi saya menyadari ini adalah pilihan yang buruk
nama.)

Di Scipy tahun ini, panda cukup populer. Saya bisa merasakannya tumpah
ke domain lain, dan orang-orang menghadapi masalah yang sama dengan kami
adalah. Lebih banyak orang sudah mulai menerapkan solusi mereka sendiri. Saya
merasa bahwa inilah saatnya setidaknya memberi orang-orang ini permulaan
titik akan benar-benar diterima dengan baik. Bahkan jika kita mengakui bahwa mereka akan
perlu menyesuaikan, dan itu tidak akan menjadi bagian dari panda, akan menyenangkan untuk
memiliki
sesuatu untuk memulai. Paling tidak, memiliki paket kecil dan
beberapa dokumen yang mengatakan "inilah cara kami menerapkannya dan ini semua
peringatan"
akan menjadi titik awal yang bagus bagi orang lain yang ingin menyesuaikan data panda
struktur.

Pada Kam, 27 Jun 2013 jam 19:24, dalejung [email protected]
menulis:

Tampaknya tidak masuk akal untuk jujur. Sementara saya mencoba membuatnya sekuat
mungkin, komposisi panda bekerja seperti yang saya pikir seharusnya. Keputusan
Suka

  • apakah akan menyebarkan meta-data
  • apakah df['name'] = s harus menimpa s.name
  • tidak mendukung HDF5 secara langsung.

mudah dibuat untuk kasus penggunaan saya. Ini adalah keputusan yang akan memiliki
ke
lebih baik dipikirkan jika termasuk dalam panda. Ada alasan mengapa tidak
telah dimasukkan sejauh ini.

Ambil hdf5 misalnya. Saya memilih untuk menyimpan data numerik di
hdf5dan metadata secara terpisah. Jadi ini berfungsi lebih seperti bundel di MacOSX.
Anda
tidak akan mendapatkan subkelas dari hdf5, Anda baru saja mendapatkan DataFrame.

Plus, saya masih berpikir akan lebih baik untuk membuat dataframe api di mana a
kelas
dapat mengekspos representasi DataFrame untuk operasi panda. Jadi sebagai gantinya
dari
memeriksa isinstance(obj, DataFrame) dan beroperasi pada obj, kami akan memeriksa
dataframe , sebut saja, dan operasikan saat kembali.

Itu akan membuat komposisi menjadi sederhana.


Balas email ini secara langsung atau lihat di GitHub<
https://github.com/pydata/pandas/issues/2485#issuecomment-20163856>
.


Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/pydata/pandas/issues/2485#issuecomment -20164504
.

@hugadams apakah Anda mempertimbangkan untuk mencoba memfaktorkan ulang kode DataFrame untuk mengganti panggilan ke DataFrame ke _constructor dan mungkin menambahkan panggilan kelas lain (seperti Series ke _series dan Panel to _panel ) yang akan (secara internal) mengembalikan objek yang akan digunakan untuk membuat elemen (jadi, dalam banyak metode, alih-alih Series() , dapat menggunakan self._series() ), dll. Secara khusus, ini akan berhasil karena mungkin bekerja di pandas core dan berguna.

Saya mensubklasifikasikan DataFrame untuk menyediakan meta-data (seperti atribut nama). Untuk menyiasati semua metode yang mengembalikan objek kerangka data baru, saya membuat dekorator untuk mengambil df yang dikembalikan dan menjadikannya turunan dari sub kelas saya. Ini agak menyakitkan karena itu berarti menerapkan kembali setiap metode tersebut dan menambahkan dekorator. misalnya:

class NamedDataFrame(DataFrame):

    <strong i="6">@named_dataframe</strong>
     def from_csv(...):
         return super(NamedDataFrame, self).from_csv(...)

Anda dapat melihat apa yang dapat Anda lakukan wrt #6923 , #6927

ini adalah masalah yang jauh lebih sulit yang pada pandangan pertama.

anda tidak perlu sub-kelas, hanya menimpa _metadata dan __finalize__ dan Anda dapat memberikan dukungan nama atribut.

@jreback : komentar anda dari #6923:

Seluruh masalah muncul dari bagaimana menggabungkannya.

Bayangkan kami mendukung ini:

s1.filename='a'
s2.filename='b'

apa itu (s1+s2).nama file?

Pandas telah memilih pendekatan untuk menangani semantik metadata dalam Seri: begitulah cara perpustakaan menangani atribut name . Secara pribadi saya tidak melihat mengapa perilaku dasar untuk atribut metadata _any_ tidak boleh berbeda:

>>> t = np.array([0,0.1,0.2])
>>> s1 = pd.Series(t*t,t,name='Tweedledee')
>>> s2 = pd.Series(t*t,t,name='Tweedledum')
>>> s1
0.0    0.00
0.1    0.01
0.2    0.04
Name: Tweedledee, dtype: float64
>>> s1*2
0.0    0.00
0.1    0.02
0.2    0.08
Name: Tweedledee, dtype: float64
>>> s1+2
0.0    2.00
0.1    2.01
0.2    2.04
Name: Tweedledee, dtype: float64
>>> s1+s2
0.0    0.00
0.1    0.02
0.2    0.08
dtype: float64

>>> s3 = pd.Series(t*t,t,name='Tweedledum')
>>> s1+s3
0.0    0.00
0.1    0.02
0.2    0.08
dtype: float64
>>> s2+s3
0.0    0.00
0.1    0.02
0.2    0.08
Name: Tweedledum, dtype: float64
>>> s1.iloc[:2]
0.0    0.00
0.1    0.01
Name: Tweedledee, dtype: float64

Ini menunjukkan bahwa pengindeksan dan operasi menggunakan konstanta mempertahankan nama. Ini juga menunjukkan bahwa operasi biner antara Seri mempertahankan nama jika kedua operan memiliki nama yang sama, dan menghapus nama jika kedua operan memiliki nama yang berbeda..

Ini adalah perilaku dasar yang setidaknya melakukan sesuatu yang masuk akal, dan jika diperluas ke metadata secara umum, akan konsisten dengan perilaku Panda yang ada dari atribut name.

Ya, di dunia yang ideal kita dapat menulis kelas addon unit dan melampirkannya ke Seri dan membuatnya melakukan hal yang benar dalam menangani operasi matematika (memerlukan unit yang sama untuk penambahan/pengurangan, menghitung unit baru untuk perkalian/pembagian/pangkat, memerlukan bilangan tanpa unit untuk sebagian besar fungsi lainnya). Tetapi saat ini akan sangat membantu jika hanya memiliki sesuatu yang mendasar.

Saya telah memeriksa fungsionalitas _metadata dan sepertinya itu hanya bertahan saat menggunakan Seri dengan pengindeksan; penambahan/perkalian dengan penurunan konstan nilai metadata. Kombinasi seri menjadi DataFrame tampaknya tidak berfungsi dengan baik, tetapi saya tidak begitu akrab dengan semantik DataFrame seperti halnya saya dengan objek Seri.

@jason-s

ok, jadi apakah Anda mengusulkan sesuatu?

Ya, tapi saya tidak yakin bagaimana menerjemahkannya dari konsep ke kode Python yang berfungsi.

Ada kode di pandas.Series yang tampaknya mempertahankan atribut name dengan cara yang berarti di bawah pengindeksan, operasi biner dengan konstanta numerik, dan operasi biner dengan objek Series lainnya.

Apakah ada alasan mengapa entri lain dalam daftar _metadata tidak dapat ditangani dengan cara yang sama, setidaknya sebagai perilaku dasar?

Jason,

Meskipun saya tidak memiliki pendapat tentang apa yang seharusnya ada di panda dan apa
seharusnya tidak, saya dapat memberi perhatian Anda beberapa solusi.

Pertama, stephan hoyer telah melakukan banyak pekerjaan ke dalam perpustakaan xray (
http://www.slideshare.net/PyData/xray-extended-arrays-for-scientific-datasets-by-stephan-hoyer)
yang secara intrinsik mendukung metadata pada array berlabel. Berdasarkan apa
Saya telah melihat dari tutorial, ini adalah solusi paling kuat untuk masalah tersebut.

Kedua, perpustakaan geopanda memiliki kerangka data subkelas yang menyimpan
metadata. Anda mungkin dapat merekayasa sendiri dari menyalin beberapa dari mereka
pendekatan:
https://www.google.com/search?q=geopandas&aq=f&oq=geopandas&aqs=chrome.0.57j60l3j0l2.1305j1&sourceid=chrome&ie=UTF-8

Akhirnya, saya memiliki objek "MetaDataframe" yang cukup banyak diretas, tapi
akan bekerja dengan cara yang Anda inginkan. Yang harus Anda lakukan adalah subclass darinya,
dan metadata harus tetap ada. MISALNYA:

Kelas Saya(MetaDataFrame):
...

Anda tidak memerlukan perpustakaan tempat itu, hanya kelas itu sendiri:
https://github.com/hugadams/pyuvvis/blob/master/pyuvvis/pandas_utils/metadframe.py

Meskipun saya tidak bisa menjanjikan itu akan berfungsi dengan benar untuk semua kerangka data
fungsionalitas, Anda dapat mengimplementasikannya hanya dalam beberapa baris. Lihat
Kelas "SubFoo" dalam file metadataframe.py sebagai contoh.

Pada Selasa, 7 Oktober 2014 pukul 12:43, jason-s [email protected] menulis:

Ya, tapi saya tidak yakin bagaimana menerjemahkannya dari konsep ke Python yang berfungsi
kode.

Ada kode di pandas.Series yang tampaknya mempertahankan atribut name
dengan cara yang berarti di bawah pengindeksan, operasi biner dengan numerik
konstanta, dan operasi biner dengan objek Seri lainnya.

Apakah ada alasan mengapa entri lain dalam daftar _metadata tidak dapat
ditangani dengan cara yang sama, setidaknya sebagai perilaku dasar?


Balas email ini secara langsung atau lihat di GitHub
https://github.com/pydata/pandas/issues/2485#issuecomment -58215786.

Adam Hughes
Kandidat Ph.D Fisika
Universitas George Washington

Maaf, dan untuk memperjelas, objek GeoPandas adalah subkelas
kerangka data. Kelas MetaDataframe tidak; itu adalah kelas komposit yang
meneruskan panggilan ke kerangka data. Oleh karena itu, sementara Anda dapat mensubklasifikasikannya
sangat mudah, saya tidak bisa menjanjikan itu akan bekerja dengan sempurna di semua penggunaan
kasus. Solusi GeoPandas/XRay lebih kuat.

Pada Selasa, 7 Okt 2014 pukul 12:54, Adam Hughes [email protected]
menulis:

Jason,

Meskipun saya tidak memiliki pendapat tentang apa yang seharusnya ada di panda dan apa
seharusnya tidak, saya dapat memberi perhatian Anda beberapa solusi.

Pertama, stephan hoyer telah melakukan banyak pekerjaan ke dalam perpustakaan xray (
http://www.slideshare.net/PyData/xray-extended-arrays-for-scientific-datasets-by-stephan-hoyer)
yang secara intrinsik mendukung metadata pada array berlabel. Berdasarkan apa
Saya telah melihat dari tutorial, ini adalah solusi paling kuat untuk masalah tersebut.

Kedua, perpustakaan geopanda memiliki kerangka data subkelas yang menyimpan
metadata. Anda mungkin dapat merekayasa sendiri dari menyalin beberapa dari mereka
pendekatan:
https://www.google.com/search?q=geopandas&aq=f&oq=geopandas&aqs=chrome.0.57j60l3j0l2.1305j1&sourceid=chrome&ie=UTF-8

Akhirnya, saya memiliki objek "MetaDataframe" yang cukup banyak diretas, tapi
akan bekerja dengan cara yang Anda inginkan. Yang harus Anda lakukan adalah subclass darinya,
dan metadata harus tetap ada. MISALNYA:

Kelas Saya(MetaDataFrame):
...

Anda tidak memerlukan perpustakaan tempat itu, hanya kelas itu sendiri:
https://github.com/hugadams/pyuvvis/blob/master/pyuvvis/pandas_utils/metadframe.py

Meskipun saya tidak bisa menjanjikan itu akan berfungsi dengan benar untuk semua kerangka data
fungsionalitas, Anda dapat mengimplementasikannya hanya dalam beberapa baris. Lihat
Kelas "SubFoo" dalam file metadataframe.py sebagai contoh.

Pada Selasa, 7 Oktober 2014 pukul 12:43, jason-s [email protected] menulis:

Ya, tapi saya tidak yakin bagaimana menerjemahkannya dari sebuah konsep menjadi bekerja
Kode Python.

Ada kode di pandas.Series yang tampaknya mempertahankan atribut name
dengan cara yang berarti di bawah pengindeksan, operasi biner dengan numerik
konstanta, dan operasi biner dengan objek Seri lainnya.

Apakah ada alasan mengapa entri lain dalam daftar _metadata tidak dapat
ditangani dengan cara yang sama, setidaknya sebagai perilaku dasar?


Balas email ini secara langsung atau lihat di GitHub
https://github.com/pydata/pandas/issues/2485#issuecomment -58215786.

Adam Hughes
Kandidat Ph.D Fisika
Universitas George Washington

Adam Hughes
Kandidat Ph.D Fisika
Universitas George Washington

Terima kasih. Saya akan memeriksanya, bahkan mungkin membuat jari saya kotor dengan bagian dalam panda. Saya pikir ini harus dilakukan dengan benar + tidak terburu-buru, tetapi saya juga berpikir bahwa penting untuk menerapkan setidaknya beberapa fungsionalitas dasar yang berguna + memisahkannya dari solusi yang lebih umum yang mungkin ada atau mungkin tidak ada.

Sesuatu seperti:

   s1attr = getattr(series1, attrname)
   s2attr = getattr(series2, attrname)
   try:
     sresultattr = s1attr._combine(s2attr, op)
     # if the attributes know how to combine themselves, let them
   except:
     # otherwise, if they're equal, propagate to output
     # user must beware of mutable values with equivalence
     if s1attr == s2attr:
       sresultattr = s1attr
     else:
       sresultattr = None

@ jason-s dapatkah Anda menunjukkan contoh apa yang ingin Anda lakukan? pseudo-code baik-baik saja

Anda _can_ cukup menambahkan atribut tingkat kelas _metadata dan kemudian akan menyebarkan atribut itu.

Berikut adalah diskusi yang lebih panjang tentang masalah ini:

https://github.com/pydata/pandas/issues/2485

Pada Selasa, 7 Oktober 2014 pukul 13:12, jason-s [email protected] menulis:

Terima kasih. Saya akan melihatnya, bahkan mungkin membuat jari saya kotor dengan panda
internal. Saya pikir ini harus dilakukan dengan benar + tidak terburu-buru, tapi saya
juga berpikir bahwa penting untuk mendapatkan setidaknya beberapa dasar yang berguna
fungsionalitas diimplementasikan + pisahkan itu dari solusi yang lebih umum yang
mungkin atau mungkin tidak ada.

Sesuatu seperti:

s1attr = getattr(seri1, namaattr)
s2attr = getattr(seri2, namaattr)
mencoba:
sresultattr = s1attr._combine(s2attr, op)
# jika atribut tahu cara menggabungkan diri, biarkan mereka
kecuali:
# jika tidak, jika sama, sebarkan ke output
# pengguna harus berhati-hati terhadap nilai yang dapat berubah dengan kesetaraan
jika s1attr == s2attr:
sresultattr = s1attr
lain:
sresultattr = Tidak ada


Balas email ini secara langsung atau lihat di GitHub
https://github.com/pydata/pandas/issues/2485#issuecomment -58221020.

Adam Hughes
Kandidat Ph.D Fisika
Universitas George Washington

OKE. Saya akan mencoba meluangkan waktu malam ini. Karena fitur masalah di github sedikit kikuk, yang mungkin akan saya lakukan adalah membuat contoh notebook IPython + publikasikan sebagai Intisari.

Atribut _metadata berfungsi dengan baik dengan Series tetapi tampaknya berperilaku aneh pada objek DataFrame .

@ jason-s Berdasarkan pengalaman saya dengan xray , kompleksitas terbesar adalah bagaimana Anda menangani argumen metadata yang tidak dapat (atau tidak ingin) Anda periksa untuk kesetaraan, misalnya, jika metadata dapat berupa array numpy, yang pemeriksaan kesetaraan adalah elemen, atau lebih buruk, dengan beberapa nilai yang hilang (perhatikan np.nan != np.nan ). Tentu saja, ada pekerjaan di sekitar untuk hal-hal semacam ini tapi itu cukup canggung.

Saya akan menambahkan lebih banyak di #8572.

@hugadams Terima kasih atas steker

Mengerti, maaf

Pada hari Minggu, 19 Okt 2014 jam 18:12, Stephan Hoyer [email protected]
menulis:

@ jason-s https://github.com/jason-s Berdasarkan pengalaman saya dengan xray
https://github.com/xray/xray , kompleksitas terbesar adalah bagaimana Anda menangani
argumen metadata yang tidak dapat (atau tidak diinginkan) untuk memeriksa kesetaraan,
misalnya, jika metadata bisa berupa array numpy, yang pemeriksaan kesetaraannya adalah
elemen, atau lebih buruk, dengan beberapa nilai yang hilang (perhatikan np.nan != np.nan).
Tentu saja, ada pekerjaan untuk hal-hal semacam ini, tetapi itu cukup bagus
canggung.

Saya akan menambahkan lebih banyak di #8572 https://github.com/pydata/pandas/issues/8572.

@hugadams https://github.com/hugadams lain kali gunakan pegangan GH saya dan
github akan ping saya secara otomatis :).


Balas email ini secara langsung atau lihat di GitHub
https://github.com/pydata/pandas/issues/2485#issuecomment -59667968.

Adam Hughes
Kandidat Ph.D Fisika
Universitas George Washington

Ada berita tentang masalah ini? Saya baru saja menemukan diri saya berharap kemungkinan untuk melampirkan metadata (mungkin dalam dict) ke kerangka data.

tentu saja mungkin untuk menambahkan atribut propogated default seperti .attrs melalui mesin _metadata/__finalize__ . Geopoandas IIRC melakukan ini.

Tetapi akan membutuhkan sedikit audit dan pengujian. Anda dipersilakan untuk mencoba. Bisakah Anda menunjukkan kasus penggunaan non-sepele Anda?

Kasus penggunaan saya akan mirip dengan apa yang saya bayangkan @hugadams maksudkan ketika berbicara tentang bekerja dengan hasil spektroskopi - data yang konstan untuk seluruh kerangka data, seperti

  • saat bekerja dengan output dari mesin/penyiapan lab: ID mesin, pengaturan kalibrasi, ID pengguna, faktor penskalaan untuk transduser tekanan,...
  • saat melakukan analisis data: nama file dari file input, hash git dari kode analisis (untuk Ilmu yang Dapat Direproduksi), konten file konfigurasi,
  • saat melakukan simulasi: git hash dari kode simulasi (lihat di atas), parameter batch run membuat kerangka data yang dimaksud ...
    Saat ini saya melakukan beberapa pemodelan sistem, dan ingin membawa nama skenario yang saya analisis. Karena saya merasa tidak pantas untuk hanya mengisi kolom dengan "skenario 1", saya akhirnya menyalahgunakan dataframe.columns.name untuk ini - tidak terasa bersih atau idiomatis, tetapi cukup untuk kasus yang satu ini karena saya hanya ingin melampirkan _one_ string.

Saya memiliki kasus penggunaan yang sama dengan @bilderbuchi (merekam metadata eksperimental ilmiah)

  • informasi subjek - genotipe, jenis kelamin, usia
  • informasi percobaan - hash versi, hash konfigurasi

Sekarang jauh lebih mudah untuk membuat subkelas kerangka data dan menambahkan atribut Anda sendiri
dan metode. Ini tidak terjadi ketika saya memulai masalah
Pada 21 Jan 2016 08:09, "John Stowers" [email protected] menulis:

Saya memiliki kasus penggunaan yang sama dengan @bilderbuchi https://github.com/bilderbuchi
(merekam metadata eksperimental ilmiah)

  • informasi subjek - genotipe, jenis kelamin, usia
  • informasi percobaan - hash versi, hash konfigurasi


Balas email ini secara langsung atau lihat di GitHub
https://github.com/pydata/pandas/issues/2485#issuecomment -173563903.

ya, tetapi sesuatu yang bolak-balik melalui kerangka data acar vanila akan lebih disukai

Apakah fitur-fitur yang ditawarkan oleh xarray akan menjadi sesuatu yang bisa diadopsi di sini?
Struktur data

Mereka memiliki atribut data. Jika panda bisa mendapatkan fitur yang sama, ini akan sangat bagus.
Konversi satuan, propagasi satuan, dll.

Saya pikir xarray adalah apa yang Anda inginkan.

Anda juga dapat mencoba kelas metadataframe yang saya tulis beberapa tahun yang lalu. Mungkin
tidak lagi berfungsi dengan versi panda, tetapi saya belum mencobanya.

https://github.com/hugadams/scikit-spectra/blob/b6171bd3c947728e01413fe91ec0bd66a1a02a34/skspec/pandas_utils/metadframe.py

Anda harus dapat mengunduh file itu, lalu buat kelas yang memiliki
atribut seperti yang Anda inginkan. YAITU

df = MetaDataframe()
df.a = a
df.b = b

Saya pikir setelah 0,16, dimungkinkan untuk membuat subkelas kerangka data,
Baik?

YAITU

kelas MyDF(DataFrame)
diri.a = 50
diri.b = 20

Atau ini tidak terjadi?

Pada Sabtu, 23 Januari 2016 jam 8:28 pagi, DaCoEx [email protected] menulis:

Apakah fitur-fitur yang ditawarkan oleh xarray akan menjadi sesuatu yang bisa diadopsi di sini?
Struktur Data http://xarray.pydata.org/en/stable/data-structures.html

Mereka memiliki atribut data. Jika panda bisa mendapatkan fitur yang sama, ini
akan sangat bagus.
Konversi satuan, propagasi satuan, dll.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/pydata/pandas/issues/2485#issuecomment -174186659.

Adam Hughes
Kandidat Ph.D Fisika
Universitas George Washington

Inilah yang saya bicarakan:

http://pandas.pydata.org/pandas-docs/stable/internals.html#override -constructor-properties

Pada Sabtu, 23 Januari 2016 pukul 13.32 , Adam Hughes
menulis:

Saya pikir xarray adalah apa yang Anda inginkan.

Anda juga dapat mencoba kelas metadataframe yang saya tulis beberapa tahun yang lalu. Mungkin
tidak lagi berfungsi dengan versi panda, tetapi saya belum mencobanya.

https://github.com/hugadams/scikit-spectra/blob/b6171bd3c947728e01413fe91ec0bd66a1a02a34/skspec/pandas_utils/metadframe.py

Anda harus dapat mengunduh file itu, lalu buat kelas yang memiliki
atribut seperti yang Anda inginkan. YAITU

df = MetaDataframe()
df.a = a
df.b = b

Saya pikir setelah 0,16, dimungkinkan untuk membuat subkelas kerangka data,
Baik?

YAITU

kelas MyDF(DataFrame)
diri.a = 50
diri.b = 20

Atau ini tidak terjadi?

Pada Sabtu, 23 Januari 2016 jam 8:28 pagi, DaCoEx [email protected] menulis:

Apakah fitur-fitur yang ditawarkan oleh xarray akan menjadi sesuatu yang bisa diadopsi di sini?
Struktur Data http://xarray.pydata.org/en/stable/data-structures.html

Mereka memiliki atribut data. Jika panda bisa mendapatkan fitur yang sama, ini
akan sangat bagus.
Konversi satuan, propagasi satuan, dll.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/pydata/pandas/issues/2485#issuecomment -174186659.

Adam Hughes
Kandidat Ph.D Fisika
Universitas George Washington

Adam Hughes
Kandidat Ph.D Fisika
Universitas George Washington

Saya pikir xarray adalah apa yang Anda inginkan.

Jadi, apakah Anda ingin menyatakan bahwa semua yang bertujuan menggunakan metadata mungkin lebih baik menggunakan xarray?

Mereka memiliki atribut data. Jika panda bisa mendapatkan fitur yang sama, ini akan sangat bagus.
Konversi satuan, propagasi satuan, dll.

Untuk memperjelas, xarray mendukung penambahan metadata arbitrer, tetapi bukan konversi unit otomatis. Kami dapat menghubungkan perpustakaan seperti pint untuk menangani ini, tetapi sulit untuk membuat semua kasus tepi bekerja sampai numpy memiliki dukungan dtype yang lebih baik.

Saya pikir 'konversi unit otomatis berdasarkan metadata yang dilampirkan ke seri' adalah
permintaan fitur yang sangat berbeda dan lebih terlibat untuk masalah ini.
Saya harap solusi yang didukung hulu yang lebih sederhana memungkinkan pemasangan yang sederhana
metadata hanya teks dapat ditemukan sebelum meningkatkan cakupan terlalu banyak.

Pada 25 Januari 2016 pukul 17:14, Stephan Hoyer [email protected] menulis:

Mereka memiliki atribut data. Jika panda bisa mendapatkan fitur yang sama, ini
akan sangat bagus.
Konversi satuan, propagasi satuan, dll.

Untuk memperjelas, xarray mendukung penambahan metadata sewenang-wenang, tetapi tidak
konversi satuan otomatis. Kita bisa menghubungkan perpustakaan seperti pint untuk ditangani
ini, tetapi sulit untuk membuat semua kasus Edge bekerja sampai numpy memiliki
dukungan dtype yang lebih baik.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/pydata/pandas/issues/2485#issuecomment -174558259.

Ini cukup sederhana dalam versi panda saat ini.

Saya menggunakan sub-kelas di sini untuk tujuan ilustrasi.
Benar-benar semua yang dibutuhkan adalah menambahkan __finalize__ ke sebagian besar metode konstruksi
(ini sudah ada sekarang untuk Series , tetapi tidak benar-benar untuk DataFrame ).

propogasi yang tidak ambigu akan cukup mudah, dan pengguna dapat menambahkan __finalize__ untuk menangani kasus yang lebih rumit (misalnya apa yang akan Anda lakukan ketika Anda memiliki df + df2 )?

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:from pandas import DataFrame
:
:class MyDataFrame(DataFrame):
:    _metadata = ['attrs']
:
:    <strong i="15">@property</strong>
:    def _constructor(self):
:        return MyDataFrame
:
:    def _combine_const(self, other, *args, **kwargs):
:        return super(MyDataFrame, self)._combine_const(other, *args, **kwargs).__finalize__(self)
:--

In [2]: df = MyDataFrame({'A' : [1,2,3]})

In [3]: df.attrs = {'foo' : 'bar'}

In [4]: df.attrs
Out[4]: {'foo': 'bar'}

In [5]: (df+1).attrs
Out[5]: {'foo': 'bar'}

Akan mengambil tambalan untuk ini, modifikasinya cukup mudah, pengujiannya adalah kuncinya di sini.

@jreback apakah ada cara umum untuk __finalize__ ?

@postelrich untuk sebagian besar/semua hal, __finalize__ harus sudah didefinisikan (dan secara teori Anda dapat membuatnya tetap menjadi atribut). Itu tidak diuji dengan sangat baik.

Untuk Series saya pikir ini cukup kuat. DataFrame cukup bagus. Saya ragu ini berfungsi sama sekali untuk groupby/merge/sebagian besar pengurangan. Itu benar-benar tergantung pada __finalize__ (bisa disebut atau tidak), itu adalah bagian yang sederhana. Bagian yang sulit adalah memutuskan apa yang harus dilakukan.

Saya telah mengerjakan implementasi ini yang menangani masalah propagasi dengan membuat objek Metadata itu sendiri subkelas Seri. Kemudian tambal Seri untuk menyampaikan metode ke Metadata. Dengan kasar:

class MSeries(pd.Series):
    def __init__(self, *args, **kwargs):
        pd.Series.__init__(self, *args, **kwargs)
        self.metadata = SMeta(self)

    def __add__(self, other):
        res = pd.series.__add__(self, other)
        res.metadata = self.metadata.__add__(other)
        return res

class SMeta(pd.Series):
    def __init__(self, parent):
        super(...)
        self.parent = parent

    def __add__(self, other):
        new_meta = SMeta(index=self.index)
        other_meta = [... other or other.metadata or None depending ...]
        for key in self.index:
             new_meta[key] = self[key].__add__(other)

Jadi terserah pada masing-masing kelas MetaDatum untuk mengetahui cara menyebarkan.

Saya biasanya membuat ini berfungsi. Bagian yang saya belum mendapatkan kerja yang diinginkan MFrame perilaku df.metadata['A'] is df['A'].metadata . Adakah ide tentang bagaimana mewujudkannya?

Propagasi atribut (didefinisikan dalam _metadata) membuat saya pusing...

Berdasarkan kode jreback, saya sudah mencoba yang berikut:

from pandas import DataFrame
class MyDataFrame(DataFrame):
    _metadata = ['attrs']

    <strong i="7">@property</strong>
    def _constructor(self):
        return MyDataFrame

    def _combine_frame(self, other, *args, **kwargs):
        return super(MyDataFrame, self)._combine_frame(other, *args, **kwargs).__finalize__(self)

dfA = MyDataFrame({'A' : [1,2,3]})
dfA.attrs = {'foo' : 'bar'}

dfB = MyDataFrame({'B' : [6,7,8]})
dfB.attrs = {'fuzzy': 'busy'}

dfC = dfA.append(dfB)
dfC.attrs   #Returns error: 'MyDataFrame' object has no attribute 'attrs'
            #I would like that it would be {'foo': 'bar'}

Seperti yang disebutkan jreback: harus ada pilihan: apa yang harus dilakukan dengan atribut yang ditambahkan.
Namun: Saya akan sangat terbantu ketika atribut hanya '''dfA''' menyebar ke '''dfC'''

EDIT: lebih banyak sakit kepala lebih baik, itu mendorong saya untuk berpikir lebih keras :). Memecahkannya, dengan mencuri solusi __finalize__ yang disediakan GeoPandas. __finalize__ bekerja dengan cukup baik. Namun, saya tidak cukup berpengalaman untuk melakukan pengujian.

Tidak bisakah kita meletakkan metadata di nama kolom dan mengubah cara kolom diakses? Misalnya ["id"] akan menerjemahkan secara internal ke {"name": "id"}.

Tidak tahu bagian dalam panda, jadi maaf jika ini mungkin sedikit naif. Bagi saya sepertinya nama kolom benar-benar konsisten di seluruh operasi

Kasus penggunaan saya akan menambahkan deskripsi ke "variabel indikator" (hanya 0/1) yang jika tidak terlihat seperti var#1 , var#2 dll, dan saya tidak ingin mencemari nama-nama itu dengan potensi nilai-nilai panjang yang sebenarnya mereka perjuangkan.

Saya pikir kami memiliki _metadata https://pandas.pydata.org/pandas-docs/stable/development/extending.html#define -original-properties dan .attrs ditentukan untuk kasus penggunaan metadata ini . Jika ini tidak cukup mencakup kasus penggunaan yang diperlukan, masalah baru dapat dibuat tentang 2 metode tersebut. Penutupan

Apakah halaman ini membantu?
0 / 5 - 0 peringkat