Pandas: Найти спектр конечной частоты выше определенного порога - PullRequest
3 голосов
/ 11 марта 2020

долгое время читатель, первая публикация.

Я работаю с данными x, y для графиков частотной характеристики в Pandas DataFrames. Вот пример данных и графиков (см. Полный файл .csv в конце публикации):

fbc['x'],fbc['y']

(0    [89.25, 89.543, 89.719, 90.217, 90.422, 90.686...
 1    [89.25, 89.602, 90.422, 90.568, 90.744, 91.242...
 2    [89.25, 89.689, 89.895, 90.305, 91.008, 91.74,...
 3    [89.25, 89.514, 90.041, 90.275, 90.422, 90.832...
 Name: x, dtype: object,
 0    [-77.775, -77.869, -77.766, -76.572, -76.327, ...
 1    [-70.036, -70.223, -71.19, -71.229, -70.918, -...
 2    [-73.079, -73.354, -73.317, -72.753, -72.061, ...
 3    [-70.854, -71.377, -74.069, -74.712, -74.647, ...
 Name: y, dtype: object)

, где x = частота, а y = данные амплитуды. Результирующие графики для каждого из них выглядят следующим образом:

См. X, y График изображения по этой ссылке - пока недостаточно точек для встраивания

Я могу создать график для каждой строки данных x, y в кадре данных.

Что мне нужно сделать в Pandas (Python), это определить наивысшую частоту в данных до того, как частотная характеристика опустится до минимального уровня шума (навсегда). Как вы можете видеть, есть места, где данные y могут go к очень низкому значению (скажем, <-50), но затем вернуться к> - 40.

Как я могу обнаружить в Pandas / python (в идеале без итераций из-за очень больших размеров данных) найти самую высокую частоту (> -40), чтобы я знал, что частота снова не вернется к <-40, а затем снова поднимется? <strong>По сути, я пытаюсь найти конец полосы частот . Я попытался поработать с некоторыми статистическими данными Pandas (что также было бы неплохо), но мне не удалось получить полезные данные.

Заранее спасибо за любые указатели и указания, которые вы можете предоставить.

Вот файл .csv, который можно импортировать с помощью csv.reader: https://www.dropbox.com/s/ia7icov5fwh3h6j/sample_data.csv?dl=0

1 Ответ

0 голосов
/ 11 марта 2020

Мне кажется, что я нашел решение:

Основываясь на предложении @katardin, я придумал следующее, хотя думаю, что его можно оптимизировать. Опять же, я буду иметь дело с огромными объемами данных, поэтому, если кто-нибудь сможет найти более элегантное решение, оно будет оценено.

for row in fbc['y']:
    list_reverse = row

    # Reverse y data so we read from end (right to left)
    test_list = list_reverse[::-1]

    # Find value of y data above noise floor (>-50)
    res = next(x for x, val in enumerate(test_list) if val > -50) 

    # Since we reversed the y data we must take the opposite of the returned res to 
    # get the correct index
    index = len(test_list) - res

    # Print results
    print ("The index of element is : " + str(index))

Если выходные данные представляют собой номера индексов следующим образом:

The index of element is : 2460
The index of element is : 2400
The index of element is : 2398
The index of element is : 2382

Каждый, который я проверил, соответствует точной точке спада высокой частоты, которую я искал. Отличное предложение!

...