Pada dasarnya, sekarang saya memiliki satu set data dari beberapa router (AP). Router akan memeriksa perangkat pengguna setiap 3 detik dan memberi kami nomor MAC pengguna (tag_mac).

Untuk membersihkan data tersebut (karena pada suatu periode waktu, AP yang berbeda akan mengembalikan tag_macs yang sama jika pengguna berada di dekat ap lain), saya hanya membutuhkan AP dengan sinyal terkuat (ditunjukkan oleh rssi) dalam setiap 10 detik ( ambil rata-ratanya saja). Ini adalah contoh data saya.


         ap_mac  rssi       tag_mac                time
0  048b422149fa   -63  a40dbc018db7 2017-07-01 08:00:00
1  048b4223e63d   -72  a40dbc018db7 2017-07-01 08:00:00
2  048b4223e63d   -72  a40dbc018db7 2017-07-01 08:00:00
3  048b4223e63d   -72  a40dbc018db7 2017-07-01 08:00:00
4  048b4223e63d   -72  a40dbc018db7 2017-07-01 08:00:00
5  048b422149ff   -50  30b49e3715d0 2017-07-01 08:00:00
6  048b422149ff   -50  30b49e3715d0 2017-07-01 08:00:00
7  048b422149ff   -50  30b49e3715d0 2017-07-01 08:00:00
8  048b422149ff   -50  30b49e3715d0 2017-07-01 08:00:00
9  048b422149ff   -50  30b49e3715d0 2017-07-01 08:00:00

Yang saya butuhkan adalah kerangka data yang difilter di mana saya menjatuhkan semua baris memiliki rssi yang lebih lemah dalam setiap periode waktu 10 detik. Jadi yang tersisa adalah data yang dibersihkan di mana untuk setiap tag_mac saya hanya memiliki ap_macs dengan rssi terkuat.

Adakah yang bisa membantu saya dengan itu? Terima kasih!

1
jack 8 Agustus 2017, 12:44

2 jawaban

Jawaban Terbaik

Saya tidak tahu apakah saya memahami masalah Anda dengan benar, tetapi Anda dapat menggunakan Kerapu pandas seperti:

df['time'] = pd.to_datetime(df['time'])
df = df.set_index('time')
result = df.groupby([pd.TimeGrouper(freq='10S'),'ap_mac','tag_mac']).mean().reset_index()
result.groupby(['time','tag_mac'])[['ap_mac','rssi']].max()

Sunting:

Saya memodifikasi tabel Anda hanya untuk melihat cara kerja kode sehingga:

         ap_mac  rssi       tag_mac                time
0  048b422149fa   -63  a40dbc018db7 2017-07-01 08:00:00
1  048b4223e63d   -72  a40dbc018db7 2017-07-01 08:00:10
2  048b4223e63d   -72  a40dbc018db7 2017-07-01 08:00:15
3  048b4223e63d   -72  a40dbc018db7 2017-07-01 08:00:00
4  048b4223e63d   -72  a40dbc018db7 2017-07-01 08:00:00
5  048b422149ff   -50  30b49e3715d0 2017-07-01 08:00:00
6  048b422149ff   -50  30b49e3715d0 2017-07-01 08:00:30
7  048b422149ff   -50  30b49e3715d0 2017-07-01 08:00:12
8  048b422149ff   -50  30b49e3715d0 2017-07-01 08:00:00
9  048b422149ff   -50  30b49e3715d0 2017-07-01 08:00:00

Anda ingin mengelompokkan menurut waktu (setiap 10 detik), ap_mac dan tag_mac .

Anda terlebih dahulu mengonversi kolom waktu menjadi datetime menggunakan pd.to_datetime

df['time'] = pd.to_datetime(df['time'])

Untuk menggunakan TimeGrouper, Anda menempatkan waktu sebagai indeks (hanya berfungsi dengan DateTimeIndex)

df = df.set_index('time')

Dan Anda melakukan groupby untuk mendapatkan rata-rata setiap tag_mac untuk setiap ap_mac setiap 10 detik.

result = df.groupby([pd.TimeGrouper(freq='10S'),'ap_mac','tag_mac']).mean().reset_index()

Dan akhirnya,

result.groupby(['time','tag_mac'])[['ap_mac', 'rssi']].max()

Keluaran:

                                        ap_mac          rssi
time                    tag_mac         
2017-07-01 08:00:00     30b49e3715d0    048b422149ff    -50
                        a40dbc018db7    048b4223e63d    -63
2017-07-01 08:00:10     30b49e3715d0    048b422149ff    -50
                        a40dbc018db7    048b4223e63d    -72
2017-07-01 08:00:30     30b49e3715d0    048b422149ff    -50
1
Thomas Grsp 10 Agustus 2017, 08:49

Saya mengasumsikan df sebagai DataFrame

#this makes sure that the 'date' column is in the required format
df['time'] = pd.to_datetime(df['time'] , format='%Y-%m-%d %H:%M:%S')

new_df = pd.DataFrame(columns=['ap_mac','tag_mac','rssi','to','from'])

#start date - first date in the dataframe 'df'
start = pd.Timestamp(df.loc[0,'time'])

#end date is the last date in the dataframe 'df'
end = pd.Timestamp(df.loc[df.shape[0]-1,'time'])


upper = lower = start

indices_array =[]

while (end - upper >= pd.Timedelta(seconds=10)):

    upper = upper + pd.Timedelta(seconds=10)
    #data within a 10 second range is extracted into the variable data

    data = df[upper>df['time']][df['time']>=lower]

    for i in data['tag_mac'].unique():

        var = data.loc[data['tag_mac']==i].groupby('ap_mac').mean()
    #in the new_df rssi contains average values
        new_df = new_df.append({'rssi':var.max()[0],'ap_mac':var.idxmax()[0],'tag_mac':i,'to':upper,'from':lower},ignore_index=True)

    lower = upper

Dataset besar Anda, seperti yang Anda sebutkan, diringkas menjadi DataFrame new_df yang hanya berisi nilai yang Anda butuhkan

Saya telah menambahkan ke kolom baru to dan from dalam kerangka data new_df yang menunjukkan rentang waktu saat pembacaan dilakukan

new_df berisi semua tag_mac dan ap_mac terkait yang memiliki nilai Rata-rata rssi maks yang diambil sampelnya setiap sepuluh detik.

Jika Anda menghadapi kesulitan jangan ragu untuk meninggalkan komentar

1
Anirudh Bandi 9 Agustus 2017, 09:39