【问题标题】:How to use statistics on a specific portion of a list of lists如何对列表列表的特定部分使用统计信息
【发布时间】:2019-12-02 08:52:32
【问题描述】:

我有一个文本文件,其中包含以下 365 个条目的缩写列表,每个条目位于一行。第一项代表日期,第二项代表道琼斯指数

8/28/2018|26064.01953
8/29/2018|26124.57031
8/30/2018|25986.91992    

我正在使用以下代码:

import os
import math
import statistics
def main ():
    infile = open('DJI.txt', 'r')
    values = infile.read()
    infile.close()
    values=values.split("\n")
    values=[value.split("|")for value in values]
    avg = sum([float(l[1]) for l in values])/len(values)
    highest = max([float(l[1]) for l in values])
    lowest = min([float(l[1]) for l in values])
    values.sort(key = lambda x:x[1])
    print(avg)
    print(highest)
    print(lowest)
    print(values)
main()

我正在为这段代码的另外 2 个任务而苦苦挣扎,首先是找到每月的平均收盘价,而不是全年的平均值。

第二个是最高和最低的函数,数值出现的日期也要和数值一起显示。

非常感谢您的帮助。

【问题讨论】:

  • 熊猫在这里是一个很好的选择。
  • 您可以使用 Pandas DataFrame 和 Filter 方法轻松完成此过程。
  • 能否请您详细说明一下或链接?谢谢。

标签: python python-3.x list math nested-lists


【解决方案1】:

使用pandas,这个功能可以相当容易地实现:

我的输入文件:(注意额外的月份数据以检查每月平均值)

8/28/2018|26064.01953
8/29/2018|26124.57031
8/30/2018|25986.91992
9/28/2018|26064.01953
9/29/2018|25124.57031
9/30/2018|25986.91992

读取输入文件:

>>> import pandas as pd
>>> df = pd.read_csv("input.txt", '|', header=None, names=["Date", "Dow-Jones Value"], parse_dates=["Date"])
>>> df
        Date  Dow-Jones Value
0 2018-08-28      26064.01953
1 2018-08-29      26124.57031
2 2018-08-30      25986.91992
3 2018-09-28      26064.01953
4 2018-09-29      25124.57031
5 2018-09-30      25986.91992

检索统计数据:

>>> df['Dow-Jones Value'].mean() # average
25891.836586666668

>>> df.iloc[df['Dow-Jones Value'].idxmax()] # highest
Date               2018-08-29 00:00:00
Dow-Jones Value                26124.6
Name: 1, dtype: object

>>> df.iloc[df['Dow-Jones Value'].idxmin()] # lowest
Date               2018-09-29 00:00:00
Dow-Jones Value                25124.6
Name: 4, dtype: object

>>> df.sort_values('Dow-Jones Value') # sorted by Dow-Jones Value
        Date  Dow-Jones Value
4 2018-09-29      25124.57031
2 2018-08-30      25986.91992
5 2018-09-30      25986.91992
0 2018-08-28      26064.01953
3 2018-09-28      26064.01953
1 2018-08-29      26124.57031

>>> df.groupby(pd.Grouper(key='Date', freq='M')).mean() # Monthly Averages
            Dow-Jones Value
Date                       
2018-08-31     26058.503253
2018-09-30     25725.169920

【讨论】:

    【解决方案2】:

    下面的解决方案没有使用任何外部库

    from collections import defaultdict
    
    monthly_data = defaultdict(list)
    
    with open('DJI.txt') as f:
      lines = [l.strip() for l in f.readlines()]
      for line in lines:
        values = line.split('|')
        date = values[0]
        month = date.split('/')[0]
        value = float(values[1])
        monthly_data[month].append((value,date))
    for month,values in monthly_data.items():
      _values = [v[0] for v in values]
      avg = sum(_values)/len(_values)
      _min = min(values, key=lambda x: x[0])
      _max = max(values, key=lambda x: x[0])
      print('Month: {}. avg value {}, min value {}, max value {}'.format(month,avg,_min,_max))
    

    DJI.txt

    8/28/2018|26064.01953
    8/29/2018|26124.57031
    8/30/2018|25986.91992
    9/28/2018|16064.01953
    9/10/2018|12.99
    9/29/2018|16124.57031
    9/30/2018|15986.91992 
    9/12/2018|999999.91992
    

    输出

    Month: 8. avg value 26058.503253333332, min value (25986.91992, '8/30/2018'), max value (26124.57031, '8/29/2018')
    Month: 9. avg value 209637.68393600002, min value (12.99, '9/10/2018'), max value (999999.91992, '9/12/2018')
    

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      • 2020-09-28
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      相关资源
      最近更新 更多