Рассмотрим мои данные в следующем формате:
20180101,10
20180102,20
20180103,15
....
Первый - это дата, а второй - количество проданных продуктов, вместо того, чтобы вставлять все это в базу данных и использовать SQL-запросы select max xxxx, чтобы узнать, какое максимальное число в течение периода, есть ли какие-либо сокращения или полезная библиотека может служить этой цели? Спасибо.
вы можете загружать все это в кортежи и использовать maximum = max( your_tuplelist, key = lambda x:x[1]) - то же самое для мин ... если вам нужно получить его в течение периода, превышающего 1 дату, вы можете использовать groupby из itertools в отсортированном списке и критериях группировки, которые следуют ваши критерии периода и используйте это макс. В общем, все это немного расплывчато - или назовите это широкий






Пожалуйста, если это желаемый результат.
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
вам нужно определить свой «период». Это месяц, квартал или год в вашем случае?