艾依古 发表于 2020-6-27 19:56:52

这种题目该怎么设计呢?

本帖最后由 艾依古 于 2020-6-27 19:56 编辑

读取文件“nino12_dropnan_result.csv”,根据列 Lable 判断,假设若连
续出现 5 次'LaNinaTemp'则判定为出现了一次 LaNina 事件,选择 LaNina 事
件出现的开始时间存储到列表 LaNinaList 中;假设若连续出现 5 次
NinoTemp 则认为出现了 Nino 事件,选择 Nino 事件出现的开始时间存储到
列表 NinoList 中。最后,将列表 LaNinaList、NinoList 分别保存到文本文件
“LaNinaStartDate.txt”、“NinoStartDate.txt”中。

csv数据如下(部分):
Data                  Nino12           Label
1870-01-01        -1.5          LaNina Temp
1870-02-01        -0.96                LaNina Temp
1870-03-01        -0.65                LaNina Temp
1870-04-01        -0.32        Cold
1870-05-01        -0.64         LaNina Temp
1870-06-01        -0.96         LaNina Temp
1870-07-01        -0.98         LaNina Temp
1870-08-01        -1.02         LaNina Temp
1870-09-01        -1.02         LaNina Temp
1870-10-01        -1.53         LaNina Temp
1870-11-01        -1.42                LaNina Temp
1870-12-01        -1.25         LaNina Temp
1871-01-01        -0.74         LaNina Temp
1871-02-01        -0.56         LaNina Temp
1871-03-01        -0.78         LaNina Temp
1871-04-01        -0.59         LaNina Temp
1871-05-01        -0.76         LaNina Temp
1871-06-01        -0.25         Cold
1871-07-01        -0.34         Cold
1871-08-01        -0.3        Cold
……

BIO-张磊 发表于 2020-6-27 20:35:29

#导入两个模块
import pandas as pd
import itertools as it

#读取文件
data = pd.read_csv("table.csv")
label = list(data["Label"])#选择label列
date = list(data["Data"])#选择日期列

#将日期列和label列5个,5个分为一组形成一个二维列表
label_5 = for i in range(0,len(label)-4)]
date_5 = for i in range(0,len(date)-4)]

LaNina = []
Nino = []

#检测这列表中的每五个label是不是都是Lanina或者Nino,是就获取对应日期
for each_label,each_date in zip(label_5,date_5):
    if each_label.count("LaNina Temp") == 5:
      LaNina.append(each_date)
    elif each_label.count("Nino Temp") == 5:
      Nino.append(each_date)
else:#去重复,保存为新文件
    date_LaNina = sorted(set())
    date_Nino = sorted(set())
    with open("LaNinaStartDate.txt","w") as f1:
      for i in date_LaNina:
            f1.writelines("%s\n" %i)
    with open("NinoStartDate.txt","w") as f2:
      for j in date_Nino:
            f2.writelines("%s\n" %j)
            
   

BIO-张磊 发表于 2020-6-27 20:36:45

上面的结果,可以跑出来,我试过了。
不懂得话,就把你的csv文件名字改为table.csv
再把这个代码保存为一个新的py文件
把代码的py文件和csv文件放在同一个目录下
双击运行py文件,即可以出结果

艾依古 发表于 2020-6-27 20:48:24

BIO-张磊 发表于 2020-6-27 20:36
上面的结果,可以跑出来,我试过了。
不懂得话,就把你的csv文件名字改为table.csv
再把这个代码保存为一 ...

太谢谢啦!可以运行出来。
还想问一下,可以根据下面这个参考案例做这题吗?
参考案例:计算一个列表中连续相同的元素个数,并返回连续出现 4 次及以上
的 1 所在的开始位置。
import itertools
mylist =
num_times = [(k, len(list(v))) for k, v in itertools.groupby(mylist)]
print(num_times)
sumIndexList = []#存储符合要求的元素首次出现的位置
for i in range(len(num_times)):
if num_times == 1 and num_times >= 4:
sumIndex = 0
while i >= 1:
sumIndex += num_times
i = i - 1
sumIndexList.append(sumIndex)
print("符合要求的元素首次出现的位置列表为:",sumIndexList)结果:
输出结果:
[(1, 2), (0, 1), (1, 3), (0, 4), (1, 4), (0, 1), (1, 1), (0, 1), (11, 1), (0, 1)]
符合要求的元素首次出现的位置列表为:

Twilight6 发表于 2020-6-27 21:02:09

本帖最后由 Twilight6 于 2020-6-27 21:10 编辑

艾依古 发表于 2020-6-27 20:48
太谢谢啦!可以运行出来。
还想问一下,可以根据下面这个参考案例做这题吗?
参考案例:计算一个列表中 ...



这样可行不?

import pandas as pd
import itertools


dp = pd.read_csv('nino12_dropnan_result.csv')
mylist = list(dp['Label'])
date = list(dp['Data'])
num_times = [(k, len(list(v))) for k, v in itertools.groupby(mylist)]

LaNinaList = []
NinoList = []
for i in range(len(num_times)):
    if num_times == 'LaNina Temp' and num_times >= 5:
      sumIndex = 0
      while i >= 1:
            sumIndex += num_times
            i = i - 1
      if sumIndex not in LaNinaList:
            LaNinaList.append(date)
    elif num_times == 'Nino Temp' and num_times >= 5:
      sumIndex = 0
      while i >= 1:
            sumIndex += num_times
            i = i - 1
      if sumIndex not in NinoList:
            NinoList.append(date)
with open('LaNinaStartDate.txt','w') as f:
    for i in LaNinaList:
      f.write(i+'\n')
with open('NinoStartDate.txt','w') as f:
    for i in NinoList:
      f.write(i+'\n')

BIO-张磊 发表于 2020-6-27 21:18:55

Twilight6 发表于 2020-6-27 21:02
这样可行不?

他这个代码的思想是好的,但是只能得到开始日期,持续日期没法直接得出,还要慢慢去加。我卡在这了。

艾依古 发表于 2020-6-27 21:20:16

Twilight6 发表于 2020-6-27 21:02
这样可行不?

可以运行出来,但是结果好像有点问题,统计的事件开始时间会重复很多遍,有的时间不符合要求

Twilight6 发表于 2020-6-27 21:20:43

BIO-张磊 发表于 2020-6-27 21:18
他这个代码的思想是好的,但是只能得到开始日期,持续日期没法直接得出,还要慢慢去加。我卡在这了。



题目不是只要开始时间嘛{:10_297:}

艾依古 发表于 2020-6-27 21:23:33

BIO-张磊 发表于 2020-6-27 21:18
他这个代码的思想是好的,但是只能得到开始日期,持续日期没法直接得出,还要慢慢去加。我卡在这了。

好滴,谢谢你啦~

BIO-张磊 发表于 2020-6-27 21:24:12

Twilight6 发表于 2020-6-27 21:20
题目不是只要开始时间嘛

{:10_284:}好吧

Twilight6 发表于 2020-6-27 21:25:11

本帖最后由 Twilight6 于 2020-6-27 22:00 编辑

艾依古 发表于 2020-6-27 21:20
可以运行出来,但是结果好像有点问题,统计的事件开始时间会重复很多遍,有的时间不符合要求

好吧...数据没得核对,不懂怎么改进了哈哈 你试试这个,应该可以把重复的去掉:
import pandas as pd
import itertools


dp = pd.read_csv('nino12_dropnan_result.csv')
mylist = list(dp['Label'])
date = list(dp['Data'])
num_times = [(k, len(list(v))) for k, v in itertools.groupby(mylist)]

LaNinaList = []
NinoList = []
for i in range(len(num_times)):
    if num_times == 'LaNina Temp' and num_times >= 5:
      sumIndex = 0
      while i >= 1:
            sumIndex += num_times
            i = i - 1
      if date not in LaNinaList:
            LaNinaList.append(date)
    elif num_times == 'Nino Temp' and num_times >= 5:
      sumIndex = 0
      while i >= 1:
            sumIndex += num_times
            i = i - 1
      if date not in NinoList:
            NinoList.append(date)
with open('LaNinaStartDate.txt','w') as f:
    for i in set(LaNinaList):
      f.write(i+'\n')
with open('NinoStartDate.txt','w') as f:
    for i in set(NinoList):
      f.write(i+'\n')

Twilight6 发表于 2020-6-27 21:25:44

BIO-张磊 发表于 2020-6-27 21:24
好吧

{:10_297:} 你改改 我代码楼主说会出现时间不对,我不懂怎么改了

BIO-张磊 发表于 2020-6-27 21:39:01

艾依古 发表于 2020-6-27 21:23
好滴,谢谢你啦~

#导入两个模块
import pandas as pd
import itertools as it

#读取文件
data = pd.read_csv("table.csv")
label = list(data["Label"])#选择label列
date = list(data["Data"])#选择日期列


label_5 = [(key,len(list(group))) for key,group in it.groupby(label)]

LaNina = []
Nino = []
for i,j in zip(label_5,range(len(label_5))):
    if i == "LaNina Temp" and i >= 5:
      LaNina_index = 0
      while j >= 1:
            LaNina_index += label_5
            j -= 1
      LaNina.append(date)
   
    elif i == "Nino Temp" and i >= 5:
      Nino_index = 0
      while j >= 1:
            Nino_index += label_5
            j -= 1
      Nino.append(date)


with open('LaNinaStartDate.txt','w') as f1:
    for i in LaNina:
      f1.writelines(i+'\n')
with open('NinoStartDate.txt','w') as f2:
    for j in Nino:
      f2.writelines(j+'\n')      
   
你这个代码我不熟悉,我只能改成这样了

艾依古 发表于 2020-6-27 21:48:55

BIO-张磊 发表于 2020-6-27 21:39
你这个代码我不熟悉,我只能改成这样了

好滴,谢谢啦!我再去试一试

艾依古 发表于 2020-6-27 21:49:45

Twilight6 发表于 2020-6-27 21:25
好吧...数据没得核对,不懂怎么改进了哈哈 你试试这个,应该可以把重复的去掉:

哈哈,好滴,谢谢你啦!我再去试一下。

BIO-张磊 发表于 2020-6-27 21:55:14

Twilight6 发表于 2020-6-27 21:25
你改改 我代码楼主说会出现时间不对,我不懂怎么改了

      if sumIndex not in LaNinaList:
            LaNinaList.append(date)
你应该错在这一句了,sumindex是索引,但是你LaNinalist全部是日期
索引当然不会在日期列表里啦

BIO-张磊 发表于 2020-6-27 21:55:46

艾依古 发表于 2020-6-27 21:48
好滴,谢谢啦!我再去试一试

如果可以,跟我们确认一下

Twilight6 发表于 2020-6-27 21:59:39

BIO-张磊 发表于 2020-6-27 21:55
你应该错在这一句了,sumindex是索引,但是你LaNinalist全部是日期
索引当然不会在日期列表里啦

对!!!我疏忽大意了 谢谢,已改正

艾依古 发表于 2020-6-27 22:08:04

BIO-张磊 发表于 2020-6-27 21:39
你这个代码我不熟悉,我只能改成这样了

可以可以!你们两个的都可以~

艾依古 发表于 2020-6-27 22:09:56

Twilight6 发表于 2020-6-27 21:25
好吧...数据没得核对,不懂怎么改进了哈哈 你试试这个,应该可以把重复的去掉:

你们好厉害!两个人的都可以!如果想要最后写入txt文件的时间按升序排列是不是得在后面加些什么?
页: [1] 2
查看完整版本: 这种题目该怎么设计呢?