Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Python, курс доллара  (Прочитано 2465 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Python, курс доллара
« : 13 Декабря 2015, 19:35:12 »
Есть программа, ищет максимальный подмассив, есть csv файл с курсами доллара
надо как-то заставить эту программу выдирать курс рубля из этого файла, записывать его в массив, подскажите как сделать, пробую не получается.
Код: (python) [Выделить]
__author__ = 'denis'


def find_max_subarray(a, low, high):
    if high == low:
        return low, high, a[0]
    else:
        mid = int((low + high) / 2)
        left_low, left_high, left_sum = find_max_subarray(a, low, mid)
        right_low, right_high, rigth_sum = find_max_subarray(a, mid + 1, high)
        cross_low, cross_high, cross_sum = find_crossing(a, low, mid, high)
        if (left_sum >= rigth_sum) & (left_sum >= cross_sum):
            return left_sum, left_high, left_sum
        elif (rigth_sum >= left_sum) & (left_sum >= cross_sum):
            return right_low, right_high, rigth_sum
        else:
            return cross_low, cross_high, cross_sum


def find_crossing(a, low, mid, high):
    max_left = 0
    max_right = 0
    left_sum = -1e308
    sum = 0
    for i in range(mid, low, -1):
        sum = sum + a[i]
        if sum > left_sum:
            left_sum = sum
            max_left = i
            max_right = 0
    right_sum = -1e308
    sum = 0
    for j in range(mid + 1, high):
        sum = sum + a[j]
        if sum > right_sum:
            right_sum = sum
            max_right = j
    return max_left, max_right, left_sum + right_sum
#a = [13, -3, -25, 20, -3,- 16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
a = [5, -5, 4, 7]
min, max, sum = find_max_subarray(a, 0, len(a))
print(sum," ", min," ", max)
Код: (python) [Выделить]
__author__ = 'denis'
def max_subarray(a):
  pos = left = right = 0
  max_s = s = a[0]
  for i in range(1, len(a)):
    if s < 0:
      s, pos = a[i], i
    else:
      s += a[i]
    if s > max_s:
      max_s, left, right = s, pos, i
  return max_s, left, right
#a = [13, -3, -25, 20, -3,- 16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
a = [5, -5, 4, 7]
max, s, m = max_subarray(a)
print(max," ", s, " ", m)
csv файл:
http://rghost.ru/7Tzf4YqYD

adawdp

  • Гость
Re: Python, курс доллара
« Ответ #1 : 13 Декабря 2015, 21:12:02 »
2015 Dec 13; 01:11 PM; Oakville, ON, Canada.

DenisVASI, не очень понятно какова Ваша конечная цель, вот файл недельных, по-моему, котировок рубля. Что там “выдирать” взял да и скопировал…

(Нажмите, чтобы показать/скрыть)

— Может преобразования какие-то нужно делать с файлом котировок сделать его „обычным“ текстовым файлом убрать  все кавычки , а может вообще скачать котировки в другом месте?

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Python, курс доллара
« Ответ #2 : 13 Декабря 2015, 21:22:31 »
Надо чтобы я подсовывал файл в директорию, программа брала и вычисляла максимальный подмассив.
Т.е есть первый элемент находим разницу относительно его и записываем в массив и вычисляем максимальный подмассив.
была такая тема кажется на хабре:
http://habrahabr.ru/post/129576/
но там ничего не работает.
алгоритм переписал сам, с обычным массивом работает, а надо теперь с csv и вот тут у меня не получается.

Пользователь решил продолжить мысль 13 Декабря 2015, 21:24:43:
надо как то работать с библиотекой csv, но у меня не получается. А надо срочно.Прошу помогите.
« Последнее редактирование: 13 Декабря 2015, 21:24:43 от DenisVASI »

Axa-Ru

  • Гость
Re: Python, курс доллара
« Ответ #3 : 13 Декабря 2015, 23:10:16 »
Вы объясняете так, что ничего не понятно.
Вы приложили файл. На примере его объясните, что Вам нужно.
Где там первый элемент?
Разницу чего с ним находим?
Что такое максимальный подмассив?
Как я понял, вам нужно записать в массив значения курса USD/RUB. Так?

Очень удобная библиотека для обработки csv файлов: pandas
Функция чтения в массив pandas.read_csv

# python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> ar=pd.read_csv('data.csv', sep=',', header=4, skipfooter=4)
>>> ar
      End Date  USD/RUB  USD/USD  Unnamed: 3  Unnamed: 4  Unnamed: 5  \
0   2015-12-06  67.2137        1         NaN         NaN         NaN   
1   2015-11-29  65.9041        1         NaN         NaN         NaN   
2   2015-11-22  64.8637        1         NaN         NaN         NaN   
3   2015-11-15  65.6087        1         NaN         NaN         NaN   
4   2015-11-08  63.8558        1         NaN         NaN         NaN   
5   2015-11-01  63.9524        1         NaN         NaN         NaN   
6   2015-10-25  62.2468        1         NaN         NaN         NaN   
7   2015-10-18  61.8178        1         NaN         NaN         NaN   
... ... ...

[260 rows x 11 columns]
>>>

Постановка задачи на хабре какая то левая.
Если вы хотите на этом зарабатывать, то подход не верен.
« Последнее редактирование: 13 Декабря 2015, 23:58:25 от Axa-Ru »

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Python, курс доллара
« Ответ #4 : 14 Декабря 2015, 00:03:03 »
Axa-Ru,
Максимальный подмассив - массив с максимальной суммой элементов. Т.е в Arr[low..hihg] входит какой-то такой Arr1[i..j] сумма элементов которого в диапазоне от i до j имеет самое большое значение из всех возможных Arr1. Например для Arr[5, -5, 4, 7] это будет сумма 11, от 2 до 3 элемента.
Теперь к задаче.
Есть в файле отношение рубля к доллару, 34, 35 ... 60 и.т.д именно эти числа я бы и хотел записать в массив.
Под разницей я имел ввиду следующее если первый элемент 35 то разница со 2 (35) будет 1 и.т.д.
Так получится массив с положительными и отрицательными числами.
И к этому массиву я хочу применить показанный мной код.

Axa-Ru

  • Гость
Re: Python, курс доллара
« Ответ #5 : 14 Декабря 2015, 00:09:30 »
Хорошо.
Функцию чтения в массив я привел.
С помощью иттератора перепишите курсы в list из двухмероного массива.
Дальше с помощью еще одного иттератора запишите первое значение и градиенты.

Вроде так.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Python, курс доллара
« Ответ #6 : 14 Декабря 2015, 00:17:39 »
import pandas as pd
ar=pd.read_csv('data.csv', sep=',', header=4, skipfooter=4)
print(ar)

ошибку дает:
Код: (python) [Выделить]
Traceback (most recent call last):
  File "/home/denis/MaxSubArra/CSVEdu/less1.py", line 3, in <module>
    ar=pd.read_csv('data.csv', sep=',', header=4, skipfooter=4)
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 420, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 218, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 502, in __init__
    self._make_engine(self.engine)
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 616, in _make_engine
    self._engine = klass(self.f, **self.options)
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 1303, in __init__
    self.columns, self.num_original_columns = self._infer_columns()
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 1516, in _infer_columns
    line = self._buffered_line()
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 1643, in _buffered_line
    return self._next_line()
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 1659, in _next_line
    line = next(self.data)
StopIteration


Axa-Ru

  • Гость
Re: Python, курс доллара
« Ответ #7 : 14 Декабря 2015, 00:19:34 »
Вы инсталляцию сделали?
http://pandas.pydata.org/pandas-docs/stable/install.html

sudo apt-get install python-pandas

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Python, курс доллара
« Ответ #8 : 14 Декабря 2015, 00:21:51 »
Прошу прощения, подсунул пустой файл, вставил нормальный, теперь работает, а так да предварительно проинсталлировал.

Пользователь решил продолжить мысль [time]14 Декабрь 2015, 01:24:21[/time]:
У меня к сожалению очень мало времени разбираться в питоне, можете показать как заполнить массив, желательно одномерный, я не совсем понял зачем там итератор.

Пользователь решил продолжить мысль [time]14 Декабрь 2015, 01:26:35[/time]:
Плоховато я знаю синтаксис python'a, т.к больше учил java, так что простите мне мое незнание элементарного.

Пользователь решил продолжить мысль 14 Декабря 2015, 00:31:03:
Код: (python) [Выделить]
__author__ = 'denis'
import pandas as pd

ar = pd.read_csv('data.csv', sep=',', header=4, skipfooter=4)
print()
for i in range(200):
    arr = ar[3][i]
print(arr)
Как-то так нельзя (не работает) ?
« Последнее редактирование: 14 Декабря 2015, 00:31:03 от DenisVASI »

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: Python, курс доллара
« Ответ #9 : 14 Декабря 2015, 02:22:15 »
__author__ = 'denis'
import pandas as pd

ar = pd.read_csv('data.csv', sep=',', header=4, skipfooter=4)
print()
for i in range(200):
    arr = ar[3][i]
print(arr)
Как-то так нельзя (не работает) ?

Ааа жуть какая. Это Вы хотите третьючетвертую колонку вытащить просто? Или что?
Ubuntu 14.04 (Unity), MSI GE40

Axa-Ru

  • Гость
Re: Python, курс доллара
« Ответ #10 : 14 Декабря 2015, 04:56:41 »
Код: (python) [Выделить]
>>> import pandas as pd
>>> ar = pd.read_csv('data.csv', sep=',', header=None, skiprows=5, skipfooter=4)
>>> rate_l = [round(x,4) for x in ar[1]]
>>> rate_l
[67.2137, 65.9041, 64.8637, 65.6087, 63.8558, 63.9524, 62.2468, 61.8178, 62.6129, 65.7844, 65.8915, 66.36, 68.0292, 67.0027, 67.5606, 67.2073, 64.3801, 63.5075, 60.2129, 57.6009, 56.7965, 56.7307, 55.6506, 54.4377, 54.0519, 55.0578, 54.8163, 51.6295, 49.6033, 49.9235, 50.83, 51.4022, 51.7817, 51.2766, 53.7347, 57.2035, 57.7909, 60.4453, 61.5808, 61.1993, 61.8939, 61.9621, 64.8848, 67.0842, 68.5789, 64.5432, 64.5718, 61.386, 58.1688, 54.0512, 63.9909, 55.3617, 52.6925, 47.6835, 46.3769, 46.5778, 45.2313, 42.7198, 41.445, 40.6624, 40.0724, 39.7171, 38.6866, 38.364, 37.4026, 37.0435, 36.5009, 36.1069, 36.0374, 36.0954, 35.625, 35.0317, 34.7564, 34.1757, 34.218, 33.8174, 34.5105, 34.3486, 34.7369, 34.5503, 34.295, 34.7865, 35.2866, 35.7353, 35.7989, 35.7427, 35.591, 35.2575, 35.6743, 36.2635, 36.4826, 36.258, 35.8639, 35.4968, 34.9412, 34.9107, 34.9389, 34.1213, 33.4058, 33.1085, 32.9832, 32.6319, 32.9322, 32.7834, 33.008, 33.0592, 32.7127, 32.6957, 32.4794, 32.1112, 31.7729, 32.0135, 32.2347, 32.2148, 32.1045, 31.9674, 32.7578, 33.3398, 33.1467, 33.0027, 32.9547, 32.8747, 32.9102, 32.5098, 32.4216, 32.8153, 33.1364, 32.8067, 32.3981, 32.0456, 32.0573, 31.5993, 31.2949, 31.3838, 31.1849, 31.0958, 31.25, 31.4942, 31.0375, 31.4379, 30.9531, 30.84, 30.628, 30.7138, 30.5777, 30.2468, 30.073, 30.0749, 29.966, 30.0462, 30.1998, 30.1102, 30.3459, 30.4881, 30.7771, 30.6365, 30.7537, 30.9005, 31.1508, 31.6065, 31.4444, 31.3975, 31.2818, 30.7956, 31.0517, 30.9828, 31.1361, 30.8654, 31.0993, 32.0184, 32.028, 31.7903, 31.9279, 31.7049, 32.1852, 32.322, 32.0765, 32.5577, 32.4049, 32.8563, 32.6645, 32.3516, 32.692, 32.8228, 31.6279, 30.8866, 30.0568, 29.2658, 29.3534, 29.4992, 29.4861, 29.4366, 29.2331, 29.12, 29.3943, 29.4264, 29.1025, 29.5004, 29.9264, 29.887, 30.0603, 30.3376, 31.2354, 31.5989, 31.7927, 31.6943, 31.3802, 31.7369, 31.0811, 30.8307, 31.1772, 30.542, 30.3289, 30.4313, 30.1872, 30.9382, 31.083, 32.3104, 32.0534, 31.6842, 30.374, 29.6712, 28.9347, 28.8887, 28.7372, 29.2074, 27.9645, 27.5837, 27.8684, 28.1248, 27.9428, 27.978, 28.1018, 27.9764, 27.6731, 27.9054, 28.2155, 28.0727, 27.8934, 27.5148, 27.6127, 28.0885, 28.1122, 28.1604, 28.3673, 28.259, 28.5955, 28.4284, 28.4078, 29.0643, 29.21, 29.2946, 29.3608, 29.7611, 29.7807, 30.2266, 30.6509, 30.4098, 30.6062, 30.6417]
>>>

Python очень специфический язык. Без книжки будет тяжко.
(Нажмите, чтобы показать/скрыть)
Сила python в библиотеках и мощных иттераторах.
Придется разбираться.

напочитать: https://dropmefiles.com/jLnle

« Последнее редактирование: 14 Декабря 2015, 05:34:13 от Axa-Ru »

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Python, курс доллара
« Ответ #11 : 14 Декабря 2015, 05:52:32 »
Спасибо за помощь  :) Я учусь, нужно до среды накидать доклад по алгоритмам поиска этого подмассива, вот и попросили привязать задачу к чему-то отдаленно реальному.Спасибо еще раз.

Пользователь решил продолжить мысль 14 Декабря 2015, 05:58:07:
За справочники отдельно спасибо  ;)
« Последнее редактирование: 14 Декабря 2015, 05:58:07 от DenisVASI »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Python, курс доллара
« Ответ #12 : 15 Декабря 2015, 18:08:16 »
Странный алгоритм поиска максимального подмассива… Как на меня имело бы смысл найти суммы идущих подряд положительных и отрицательных элементов. А потом попарно сравнивать элементы в массиве сумм: если положительная сумма больше чем отрицательная, то имеет смысл включения элементов данной суммы в подмассив.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Axa-Ru

  • Гость
Re: Python, курс доллара
« Ответ #13 : 15 Декабря 2015, 18:13:00 »
положительных и отрицательных элементов.
градиентов?

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Python, курс доллара
« Ответ #14 : 15 Декабря 2015, 20:44:10 »
Axa-Ru, элементов массива. Если это массив градиентов, то градиентов.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.073 секунд. Запросов: 26.