鱼C论坛

 找回密码
 立即注册
查看: 2112|回复: 24

[已解决]这种题目该怎么设计呢?

[复制链接]
发表于 2020-6-27 19:56:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 艾依古 于 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
……
最佳答案
2020-6-27 21:39:01

  1. #导入两个模块
  2. import pandas as pd
  3. import itertools as it

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


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

  9. LaNina = []
  10. Nino = []
  11. for i,j in zip(label_5,range(len(label_5))):
  12.     if i[0] == "LaNina Temp" and i[1] >= 5:
  13.         LaNina_index = 0
  14.         while j >= 1:
  15.             LaNina_index += label_5[j-1][1]
  16.             j -= 1
  17.         LaNina.append(date[LaNina_index])
  18.    
  19.     elif i[0] == "Nino Temp" and i[1] >= 5:
  20.         Nino_index = 0
  21.         while j >= 1:
  22.             Nino_index += label_5[j-1][1]
  23.             j -= 1
  24.         Nino.append(date[Nino_index])


  25. with open('LaNinaStartDate.txt','w') as f1:
  26.     for i in LaNina:
  27.         f1.writelines(i+'\n')
  28. with open('NinoStartDate.txt','w') as f2:
  29.     for j in Nino:
  30.         f2.writelines(j+'\n')        
  31.    
复制代码
你这个代码我不熟悉,我只能改成这样了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-27 20:35:29 | 显示全部楼层
  1. #导入两个模块
  2. import pandas as pd
  3. import itertools as it

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

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

  11. LaNina = []
  12. Nino = []

  13. #检测这列表中的每五个label是不是都是Lanina或者Nino,是就获取对应日期
  14. for each_label,each_date in zip(label_5,date_5):
  15.     if each_label.count("LaNina Temp") == 5:
  16.         LaNina.append(each_date)
  17.     elif each_label.count("Nino Temp") == 5:
  18.         Nino.append(each_date)
  19. else:#去重复,保存为新文件
  20.     date_LaNina = sorted(set([i for i in it.chain(*LaNina)]))
  21.     date_Nino = sorted(set([i for i in it.chain(*Nino)]))
  22.     with open("LaNinaStartDate.txt","w") as f1:
  23.         for i in date_LaNina:
  24.             f1.writelines("%s\n" %i)
  25.     with open("NinoStartDate.txt","w") as f2:
  26.         for j in date_Nino:
  27.             f2.writelines("%s\n" %j)
  28.             
  29.    
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 20:36:45 | 显示全部楼层
上面的结果,可以跑出来,我试过了。
不懂得话,就把你的csv文件名字改为table.csv
再把这个代码保存为一个新的py文件
把代码的py文件和csv文件放在同一个目录下
双击运行py文件,即可以出结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

太谢谢啦!可以运行出来。
还想问一下,可以根据下面这个参考案例做这题吗?
参考案例:计算一个列表中连续相同的元素个数,并返回连续出现 4 次及以上
的 1 所在的开始位置。
import itertools
mylist = [1,1,0,1,1,1,0,0,0,0,1,1,1,1,0,1,0,11,0]
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[i][0] == 1 and num_times[i][1] >= 4:
sumIndex = 0
while i >= 1:
sumIndex += num_times[i-1][1]
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)]
符合要求的元素首次出现的位置列表为: [10]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:02:09 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-27 21:10 编辑
艾依古 发表于 2020-6-27 20:48
太谢谢啦!可以运行出来。
还想问一下,可以根据下面这个参考案例做这题吗?
参考案例:计算一个列表中 ...




这样可行不?

  1. import pandas as pd
  2. import itertools


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

  7. LaNinaList = []
  8. NinoList = []
  9. for i in range(len(num_times)):
  10.     if num_times[i][0] == 'LaNina Temp' and num_times[i][1] >= 5:
  11.         sumIndex = 0
  12.         while i >= 1:
  13.             sumIndex += num_times[i - 1][1]
  14.             i = i - 1
  15.         if sumIndex not in LaNinaList:
  16.             LaNinaList.append(date[sumIndex])
  17.     elif num_times[i][0] == 'Nino Temp' and num_times[i][1] >= 5:
  18.         sumIndex = 0
  19.         while i >= 1:
  20.             sumIndex += num_times[i - 1][1]
  21.             i = i - 1
  22.         if sumIndex not in NinoList:
  23.             NinoList.append(date[sumIndex])
  24. with open('LaNinaStartDate.txt','w') as f:
  25.     for i in LaNinaList:
  26.         f.write(i+'\n')
  27. with open('NinoStartDate.txt','w') as f:
  28.     for i in NinoList:
  29.         f.write(i+'\n')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:18:55 | 显示全部楼层

他这个代码的思想是好的,但是只能得到开始日期,持续日期没法直接得出,还要慢慢去加。我卡在这了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 21:20:16 | 显示全部楼层

可以运行出来,但是结果好像有点问题,统计的事件开始时间会重复很多遍,有的时间不符合要求
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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



题目不是只要开始时间嘛

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好滴,谢谢你啦~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:24:12 | 显示全部楼层
Twilight6 发表于 2020-6-27 21:20
题目不是只要开始时间嘛

好吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:25:11 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-27 22:00 编辑
艾依古 发表于 2020-6-27 21:20
可以运行出来,但是结果好像有点问题,统计的事件开始时间会重复很多遍,有的时间不符合要求


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


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

  7. LaNinaList = []
  8. NinoList = []
  9. for i in range(len(num_times)):
  10.     if num_times[i][0] == 'LaNina Temp' and num_times[i][1] >= 5:
  11.         sumIndex = 0
  12.         while i >= 1:
  13.             sumIndex += num_times[i - 1][1]
  14.             i = i - 1
  15.         if date[sumIndex] not in LaNinaList:
  16.             LaNinaList.append(date[sumIndex])
  17.     elif num_times[i][0] == 'Nino Temp' and num_times[i][1] >= 5:
  18.         sumIndex = 0
  19.         while i >= 1:
  20.             sumIndex += num_times[i - 1][1]
  21.             i = i - 1
  22.         if date[sumIndex] not in NinoList:
  23.             NinoList.append(date[sumIndex])
  24. with open('LaNinaStartDate.txt','w') as f:
  25.     for i in set(LaNinaList):
  26.         f.write(i+'\n')
  27. with open('NinoStartDate.txt','w') as f:
  28.     for i in set(NinoList):
  29.         f.write(i+'\n')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:25:44 | 显示全部楼层

你改改 我代码楼主说会出现时间不对,我不懂怎么改了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:39:01 | 显示全部楼层    本楼为最佳答案   

  1. #导入两个模块
  2. import pandas as pd
  3. import itertools as it

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


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

  9. LaNina = []
  10. Nino = []
  11. for i,j in zip(label_5,range(len(label_5))):
  12.     if i[0] == "LaNina Temp" and i[1] >= 5:
  13.         LaNina_index = 0
  14.         while j >= 1:
  15.             LaNina_index += label_5[j-1][1]
  16.             j -= 1
  17.         LaNina.append(date[LaNina_index])
  18.    
  19.     elif i[0] == "Nino Temp" and i[1] >= 5:
  20.         Nino_index = 0
  21.         while j >= 1:
  22.             Nino_index += label_5[j-1][1]
  23.             j -= 1
  24.         Nino.append(date[Nino_index])


  25. with open('LaNinaStartDate.txt','w') as f1:
  26.     for i in LaNina:
  27.         f1.writelines(i+'\n')
  28. with open('NinoStartDate.txt','w') as f2:
  29.     for j in Nino:
  30.         f2.writelines(j+'\n')        
  31.    
复制代码
你这个代码我不熟悉,我只能改成这样了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 21:48:55 | 显示全部楼层
BIO-张磊 发表于 2020-6-27 21:39
你这个代码我不熟悉,我只能改成这样了

好滴,谢谢啦!我再去试一试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈,好滴,谢谢你啦!我再去试一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:55:14 | 显示全部楼层
Twilight6 发表于 2020-6-27 21:25
你改改 我代码楼主说会出现时间不对,我不懂怎么改了
  1.         if sumIndex not in LaNinaList:
  2.             LaNinaList.append(date[sumIndex])
复制代码

你应该错在这一句了,sumindex是索引,但是你LaNinalist全部是日期
索引当然不会在日期列表里啦

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
Twilight6 + 5 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:55:46 | 显示全部楼层
艾依古 发表于 2020-6-27 21:48
好滴,谢谢啦!我再去试一试

如果可以,跟我们确认一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


对!!!我疏忽大意了 谢谢,已改正
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 22:08:04 | 显示全部楼层
BIO-张磊 发表于 2020-6-27 21:39
你这个代码我不熟悉,我只能改成这样了

可以可以!你们两个的都可以~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 22:09:56 | 显示全部楼层
Twilight6 发表于 2020-6-27 21:25
好吧...数据没得核对,不懂怎么改进了哈哈 你试试这个,应该可以把重复的去掉:

你们好厉害!两个人的都可以!如果想要最后写入txt文件的时间按升序排列是不是得在后面加些什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 15:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表