首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环python的更好解决方案或优化

循环python的更好解决方案或优化
EN

Stack Overflow用户
提问于 2020-05-28 04:00:25
回答 2查看 79关注 0票数 0

我的数据集如下:

代码语言:javascript
运行
复制
[{'Date': '22-Aug-2019', 'Open': 10905.3, 'High': 10908.25, 'Low': 10718.3, 'Close': 10741.35, 'Shares Traded': 668193449, 'Turnover (Rs. Cr)': 18764.38},
{'Date': '23-Aug-2019', 'Open': 10699.6, 'High': 10862.55, 'Low': 10637.15, 'Close': 10829.35, 'Shares Traded': 667079625, 'Turnover (Rs. Cr)': 20983.75}, {'Date': '26-Aug-2019', 'Open': 11000.3, 'High': 11070.3, 'Low': 10756.55, 'Close': 11057.85, 'Shares Traded': 684141923, 'Turnover (Rs. Cr)': 22375.99}]

我想要这个数据集的日平均,Min,Max作为我的输出,我做了。

代码语言:javascript
运行
复制
for share in dataset:
    day_name = datetime.datetime.strptime(share['Date'], "%d-%b-%Y").strftime('%A')
    if day_name not in day_wise.keys():
        day_wise[day_name] = {'avg':0, 'min':9999999999, 'max':0}

        if share['Turnover (Rs. Cr)'] > day_wise[day_name]['max']:
            day_wise[day_name]['max'] = share['Turnover (Rs. Cr)']
        if share['Turnover (Rs. Cr)'] < day_wise[day_name]['min']:
            day_wise[day_name]['min'] = share['Turnover (Rs. Cr)']
        day_wise[day_name]['avg'] += share['Turnover (Rs. Cr)']

    else:
        if share['Turnover (Rs. Cr)'] > day_wise[day_name]['max']:
            day_wise[day_name]['max'] = share['Turnover (Rs. Cr)']
        if share['Turnover (Rs. Cr)'] < day_wise[day_name]['min']:
            day_wise[day_name]['min'] = share['Turnover (Rs. Cr)']
        day_wise[day_name]['avg'] += share['Turnover (Rs. Cr)']         
return Response(day_wise)

但我想优化它,比如减少代码行数,提高性能。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-28 04:21:30

如果你可以使用熊猫,试试这个。

将dict加载到熊猫数据中,在数字列上应用群比 on Date & aggregate,然后使用字典将数据转换回dict。

代码语言:javascript
运行
复制
import pandas as pd

>>> df = pd.DataFrame(data)

          Date     Open      High       Low     Close  Shares Traded  Turnover (Rs. Cr)
0  22-Aug-2019  10905.3  10908.25  10718.30  10741.35      668193449           18764.38
1  23-Aug-2019  10699.6  10862.55  10637.15  10829.35      667079625           20983.75
2  26-Aug-2019  11000.3  11070.30  10756.55  11057.85      684141923           22375.99

>>> df['Day'] = pd.to_datetime(df['Date'], format="%d-%b-%Y").dt.strftime("%A")

>>> df_g = df.groupby('Day')['Turnover (Rs. Cr)'].agg(['min','max','mean'])

               min       max      mean
Day                                   
Friday    20983.75  20983.75  20983.75
Monday    22375.99  22375.99  22375.99
Thursday  18764.38  18764.38  18764.38

>>> df_g.to_dict(orient='index')

{'Friday': {'max': 20983.75, 'mean': 20983.75, 'min': 20983.75},
 'Monday': {'max': 22375.99, 'mean': 22375.99, 'min': 22375.99},
 'Thursday': {'max': 18764.38, 'mean': 18764.38, 'min': 18764.38}}
票数 1
EN

Stack Overflow用户

发布于 2020-05-28 04:27:42

减少代码的一个简单而优雅的方法是使用DataFrame。如下所示:

代码语言:javascript
运行
复制
import pandas as pd
import calendar

df_data = pd.DataFrame(dataset)

# Convert to day week name
df_data["Date"] = pd.to_datetime(df_data["Date"])
df_data["Date"] = df_data["Date"].apply(lambda x: calendar.day_name[x.weekday()])

day_wise = {}
for name, group in df_data.groupby('Date'):
    day_wise[name] = {
        "avg": group["Turnover (Rs. Cr)"].sum(),
        "min": group["Turnover (Rs. Cr)"].min(),
        "max": group["Turnover (Rs. Cr)"].max()
    }
代码语言:javascript
运行
复制
>> day_wise
{'Friday': {'avg': 20983.75, 'min': 20983.75, 'max': 20983.75},
 'Monday': {'avg': 22375.99, 'min': 22375.99, 'max': 22375.99},
 'Thursday': {'avg': 18764.38, 'min': 18764.38, 'max': 18764.38}}

注意,我使用sum()而不是avg(),因为您的示例只执行sum。如果您想要平均值(即avg),只需在代码中更改mean()的sum()即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62056827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档