Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 27, 2017 13:28:42

outrage
Зарегистрирован: 2017-01-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Интерполяция

Всем привет! Огромнейшая проблема просто для меня, поскольку язык для меня абсолютно неизвестный, а скроки выполнения работы крайне малы. Есть таблица Excel с данными и пропусками в них. Есть уже функция, которая считывает эти данные, адаптирует формат даты, делит данные на массивы по годам. Нужна функция, которая будет проходить по всем столбцам и проводить интерполяцию в них. Тип интерполяции не важен. Библиотека SciPy (которая, к слову, у меня не ставится, а на Линуксе и Маке без проблем). Код, который уже есть, привожу ниже, файл тоже. Умоляю, выручайте!

 import xlrd
 
file_location = "E:/FIRES.xls"
workbook = xlrd.open_workbook(file_location)
sheet = workbook.sheet_by_index(0)
print (sheet.nrows)
print (sheet.ncols)
 
date = sheet.cell_value(1, 0)
true = xlrd.xldate.xldate_as_datetime(date, workbook.datemode)
check_year = str(true).split('-')[0]
 
print (check_year)
 
array_one = []
array_two = []
test = []
 
for row in range(1, sheet.nrows, 1):
    del array_two[:]
    for col in range(sheet.ncols):
        array_two.append(sheet.cell(row, col))
 
    date = sheet.cell_value(row, 0)
    true = xlrd.xldate.xldate_as_datetime(date, workbook.datemode)
    year = str(true).split('-')[0]
    del array_two[0]
    array_two.insert(0, year)
    array_two.insert(0, true)
    array_one.append(array_two)
    if year == check_year:
        test.append(array_two)
    else:
        print (test)
        check_year = year
        test = []

Файл Эксел (слишком большой для вложения) https://drive.google.com/open?id=0B7_5i1doXsLSXzd2akl1cjQzQW8

Отредактировано outrage (Янв. 27, 2017 13:44:54)

Офлайн

#2 Янв. 27, 2017 13:41:46

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Интерполяция

Ссылка на файл в гугл-диске не работает (404 error).
Поэтому трудно представить, в чем задача; но в любом случае – я бы рекомендовал для ее решения пакет pandas, который (на базе xlrd) может работать с xls-файлами, а также может выполнять интерполяцию, заполнение пропущенных данных и т.п.
Под Windows устанавливать лучше свободно распространяемый дистрибутив anaconda (от continuum analytics), который содержит и Python и много полезных пакетов для решения вычислительных задач и задач обработки данных.

Офлайн

#3 Янв. 27, 2017 13:47:25

outrage
Зарегистрирован: 2017-01-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Интерполяция

scidam
Ссылка на файл в гугл-диске не работает (404 error).Поэтому трудно представить, в чем задача; но в любом случае – я бы рекомендовал для ее решения пакет pandas, который (на базе xlrd) может работать с xls-файлами, а также может выполнять интерполяцию, заполнение пропущенных данных и т.п.Под Windows устанавливать лучше свободно распространяемый дистрибутив anaconda (от continuum analytics), который содержит и Python и много полезных пакетов для решения вычислительных задач и задач обработки данных.
Прошу прощения, заменила ссылку на нормальную. Собственно, сама библиотека не проблема, у меня есть кого попросить ее поставить на Маке, проблема конкретно в самом коде, потому что, как я писала выше, язык ну аж вообще не знакомый, руководитель диплома поставил уж больно сложную задачу выучить язык и сделать диплом за короткий срок.

Офлайн

#4 Янв. 27, 2017 15:12:59

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Интерполяция

C установленным пакетом pandas Ваша задача решается следующим образом:

 import pandas as pd                                                              
data = pd.read_excel('FIRES.xls')                                                
print(data.info()) # Информация о загруженных данных (до интерполяции)
print(data.interpolate().info())  # выводит информацио о данных после интерполяции (линейной) пропущенных данных

Я загрузил Ваши данные и получил следующее:

 <class 'pandas.core.frame.DataFrame'>
RangeIndex: 2760 entries, 0 to 2759
Data columns (total 11 columns):
date         2760 non-null datetime64[ns]
proton1      2712 non-null float64
proton2      2712 non-null float64
proton3      2712 non-null float64
electron1    2747 non-null float64
electron2    2747 non-null float64
fluks107     2760 non-null int64
speed        2754 non-null float64
np           2754 non-null float64
temp         2484 non-null float64
newfires     2664 non-null float64
dtypes: datetime64[ns](1), float64(9), int64(1)
memory usage: 237.3 KB
==================== Далее идет то, что после интерполяции:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2760 entries, 0 to 2759
Data columns (total 11 columns):
date         2760 non-null datetime64[ns]
proton1      2760 non-null float64
proton2      2760 non-null float64
proton3      2760 non-null float64
electron1    2760 non-null float64
electron2    2760 non-null float64
fluks107     2760 non-null int64
speed        2760 non-null float64
np           2760 non-null float64
temp         2760 non-null float64
newfires     2760 non-null float64
dtypes: datetime64[ns](1), float64(9), int64(1)
memory

Видно, что до интерполяции, колонки содержали пропущенные данные (я переименовал названия колонок, а то там были спец символы <> и т.п.) non-null меньше там 2760, а после интерполяции данные есть во всех колонках. При желании, средствами pandas можно также сохранить интерполированный массив, также в xls-документ, например.

Офлайн

#5 Янв. 27, 2017 16:20:41

outrage
Зарегистрирован: 2017-01-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Интерполяция

scidam
C установленным пакетом pandas Ваша задача решается следующим образом:
Довольно интересно, надо будет покопаться и разобраться, большое спасибо за ответ!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version