Есть ли простой способ получить максимум и минимум в Python?

Рассмотрим мои данные в следующем формате:

20180101,10
20180102,20
20180103,15
....

Первый - это дата, а второй - количество проданных продуктов, вместо того, чтобы вставлять все это в базу данных и использовать SQL-запросы select max xxxx, чтобы узнать, какое максимальное число в течение периода, есть ли какие-либо сокращения или полезная библиотека может служить этой цели? Спасибо.

вам нужно определить свой «период». Это месяц, квартал или год в вашем случае?

RomanPerekhrest 09.12.2018 15:12

вы можете загружать все это в кортежи и использовать maximum = max( your_tuplelist, key = lambda x:x[1]) - то же самое для мин ... если вам нужно получить его в течение периода, превышающего 1 дату, вы можете использовать groupby из itertools в отсортированном списке и критериях группировки, которые следуют ваши критерии периода и используйте это макс. В общем, все это немного расплывчато - или назовите это широкий

Patrick Artner 09.12.2018 15:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
190
5

Ответы 5

Пожалуйста, если это желаемый результат.

data = [{'date':1, 'products_sold': 2}, {'date':2, 'products_sold': 5},{'date':5, 'products_sold': 2}]
start_date = 1
end_date = 2
max_value_in_period = max(x['products_sold'] for x in data if x['date'] >= start_date and x['date'] <= end_date)
print(max_value_in_period)

Панды - это та библиотека, которую вы хотите.

Позвольте мне показать вам на примере:

import numpy as np
import pandas as pd

# let's build a dummy dataset
index = pd.date_range(start = "1/1/2015", end = "31/12/2018")
df = pd.DataFrame(np.random.randint(100, size=len(index)),
                  columns=["sales"], index=index)

>>> df.head()
            sales
2015-01-01     32
2015-01-02      0
2015-01-03     12
2015-01-04     77
2015-01-05     86

Теперь предположим, что вы хотите суммировать продажи за месяц:

>>> df["sales"].groupby(pd.Grouper(freq = "1M")).sum()

2015-01-31    1441
2015-02-28    1164
2015-03-31    1624
2015-04-30    1629
2015-05-31    1427
[...]

Или на семестровой основе

df["sales"].groupby(pd.Grouper(freq = "6M", closed = "left", label = "right")).sum()    
2015-06-30    8921
2015-12-31    9365
2016-06-30    9820
2016-12-31    8881
2017-06-30    8773
2017-12-31    8709
2018-06-30    9481
2018-12-31    9522
2019-06-30      51

по какой-то причине сборка Grouper с шестимесячной периодичностью имеет некоторые проблемы с продажами 31/12, и она помещает их в новую корзину в 2019 году, глядя на нее, вы узнаете, найду ли я что-нибудь ... или если кто-то еще захочет прокомментировать, пожалуйста делать

Или вы хотите узнать, какой семестр был лучшим:

>>> df["sales"].groupby(pd.Grouper(freq = "6M")).sum().idxmax()              
Timestamp('2016-06-30 00:00:00', freq='6M')

вы должны использовать pandas

предполагая, что ваш столбец даты называется 'date' и что это dtypes datetime:

import pandas as pd
df = pd.DataFrame(data)
df = df.set_index('date')
df.groupby(pd.Grouper(freq='1M')).max()

даст вам каждый месяц макс. freq можно изменить на любую желаемую частоту.

Я попробовал комментарий от @Patrick Artner:

a = (20180101,10)
b = (20180102,20)
c = (20180103,15)
d = (a,b,c)
maximum = max( d, key = lambda x:x[1])
minimum = min(d, key= lambda x:x[1])
print(minimum)

Может быть, это дает какое-то вдохновение.

Это может быть предвзятый ответ, но pandas действительно хорош для обработки таких данных. Хотя вы можете выполнить такого рода операции, используя кортежи, списки и т. д. pandas предлагает гораздо больше функций. Например:

import pandas as pd
data = [[20180101,15], [20180102,10], [20180103,12],[20180104,10]]
df = pd.DataFrame(data=data, columns=['date', 'products'])
# if your data is in csv, excel, database... whatever... you can easily pull
# df = pd.read_csv('name') || pd.read_excel() || pd.read_sql()
df
Out[2]: 
       date  products
0  20180101        15
1  20180102        10
2  20180103        12
3  20180104        10

# It helps to use datetime format to perform operations on the data
# Operations make reference to an "index" in the dataframe
df.index = pd.to_datetime(df['date'], format = "%Y%m%d")  #strftime format
df
Out[3]: 
                date  products
date                          
2018-01-01  20180101        15
2018-01-02  20180102        10
2018-01-03  20180103        12
2018-01-04  20180104        10

# Now we can drop that date column...
df.drop(columns='date', inplace=True)
df
Out[4]: 
            products
date                
2018-01-01        15
2018-01-02        10
2018-01-03        12
2018-01-04        10

# Yes, there are ways to do the above in shorthand... lots of info on pandas on SO
# I want you to see the individual steps we are taking to keep simple

# Now is when the fun begins
df.rolling(2).sum()  # prints a rolling 2-day sum
Out[5]: 
            products
date                
2018-01-01       NaN
2018-01-02      25.0
2018-01-03      22.0
2018-01-04      22.0

df.rolling(3).mean()  # prints a rolling 3-day average
Out[6]: 
             products
date                 
2018-01-01        NaN
2018-01-02        NaN
2018-01-03  12.333333
2018-01-04  10.666667

df.resample('W').sum()  # Resamples the data so you can look on a weekly basis
Out[7]: 
            products
date                
2018-01-07        47

df.rolling(2).max() # max number of products over a rolling two-day period
Out[9]: 
            products
date                
2018-01-01       NaN
2018-01-02      15.0
2018-01-03      12.0
2018-01-04      12.0

Другие вопросы по теме