static void Main(string[] args) { //Нужно дополнить модель WeatherEvent, создать список этого типа List<> //И заполнить его, читая файл с данными построчно через StreamReader //Ссылка на файл https://www.kaggle.com/sobhanmoosavi/us-weather-events //Написать Linq-запросы, используя синтаксис методов расширений //и продублировать его, используя синтаксис запросов //(возможно с вкраплениями методов расширений, ибо иногда первого может быть недостаточно) //0. Linq - сколько различных городов есть в датасете. //1. Сколько записей за каждый из годов имеется в датасете. //Потом будут еще запросы List <WeatherEvent> We = new List <WeatherEvent>(); using (StreamReader sr = new StreamReader("WeatherEvents_Jan2016-Dec2020.csv")) { string line; sr.ReadLine(); while ((line = sr.ReadLine()) != null) { string[] elements = line.Split(','); WeatherEvent we = new WeatherEvent() { EventId = elements[0], Type = (WeatherEventType)Enum.Parse(typeof(WeatherEventType), elements[1]), Severity = (Severity)Enum.Parse(typeof(Severity), elements[2]), StartTime = DateTime.Parse(elements[3]), EndTime = DateTime.Parse(elements[4]), TimeZone = elements[5], AirportCode = elements[6], LocationLat = elements[7], LocationLng = elements[8], City = elements[9], County = elements[10], State = elements[11], ZipCode = elements[12] }; We.Add(we); } } int[] distinctyears = We.Select(e => e.StartTime).Select(e => e.Year).Distinct().ToArray(); Console.WriteLine($"Numbers of distinct cities: {NumbersOfDistinctCities(We)}"); Console.WriteLine(EachYearDataCount(We)); Console.WriteLine($"Numbers of weather event in 2018: {NumbersOfEventsIn(2018, We)} "); Console.WriteLine($"Numbers of state in dataset: {NumbersOfDistinctState(We)}"); Console.WriteLine($"Numbers of city in dataset: {NumbersOfDistinctCities(We)}"); Console.WriteLine("Top 3 by rain numbers in different city"); var RainingDic = DictionaryOfRainingCitiesIn(2019, We).OrderByDescending(e => e.Value).ToList(); for (int i = 0; i < 3; i++) { Console.Write($"{i + 1} place : {RainingDic[i].Key}"); Console.WriteLine($", numbers of rain: {RainingDic[i].Value}"); } foreach (var item in distinctyears) { Console.WriteLine($"Longest snow in {item} was at {LongestSnowEventIn(item, We)}"); } }
static string LongestSnowEventIn(int year, List <WeatherEvent> wetherEvent) { WeatherEvent maxSpancity = wetherEvent.Where(e => e.StartTime.Year == year && e.Type == WeatherEventType.Snow) .OrderByDescending(e => e.EndTime - e.StartTime) .First(); var snowTimeSpanDay = (maxSpancity.EndTime - maxSpancity.StartTime).ToString("%d"); var snowTimeSpanPrecise = (maxSpancity.EndTime - maxSpancity.StartTime).ToString(@"hh\:mm\:ss"); return($"{maxSpancity.City} and was continued {snowTimeSpanDay} day(s) {snowTimeSpanPrecise}"); }
static string LongestSnowEventIn(int year, List <WeatherEvent> we) { WeatherEvent maxspancity = we.Where(e => e.StartTime.Year == year) .Where(e => e.Type == WeatherEventType.Snow) .OrderByDescending(e => e.EndTime - e.StartTime) .ToList()[0]; //Or /*WeatherEvent maxspancity = (from e in we * where e.StartTime.Year == year * orderby e.EndTime - e.StartTime descending).ToList();*/ string snowtimespanday = (maxspancity.EndTime - maxspancity.StartTime).ToString("%d"); string snowtimespanprecise = (maxspancity.EndTime - maxspancity.StartTime).ToString(@"hh\:mm\:ss"); return($"{maxspancity.City} and was continued {snowtimespanday} day(s) {snowtimespanprecise}"); }
private static WeatherEvent ConvertFromStringToWeatherEvent(string line, int index) { var data = line.Split(','); if (data.Length != 13) { throw new ArgumentException($"Invalid data in line {index}!"); } WeatherEvent weatherEvent; try { data[7] = data[7].Replace('.', ','); data[8] = data[8].Replace('.', ','); weatherEvent = new WeatherEvent() { EventId = data[0], Type = Enum.Parse <WeatherEventType>(data[1]), Severity = Enum.Parse <Severity>(data[2]), StartTime = DateTime.Parse(data[3]), EndTime = DateTime.Parse(data[4]), TimeZone = data[5], AirportCode = data[6], LocationLat = double.Parse(data[7]), LocationLng = double.Parse(data[8]), City = data[9], County = data[10], State = data[11], ZipCode = data[12], }; } catch { throw new ArgumentException($"Invalid data in line {index}!"); } return(weatherEvent); }
static void Main(string[] args) { //Нужно дополнить модель WeatherEvent, создать список этого типа List<> //И заполнить его, читая файл с данными построчно через StreamReader //Ссылка на файл https://www.kaggle.com/sobhanmoosavi/us-weather-events //Написать Linq-запросы, используя синтаксис методов расширений //и продублировать его, используя синтаксис запросов //(возможно с вкраплениями методов расширений, ибо иногда первого может быть недостаточно) //0. Linq - сколько различных городов есть в датасете. //1. Сколько записей за каждый из годов имеется в датасете. //Потом будут еще запросы WeatherEvent we = new WeatherEvent() { EventId = "W-1", Type = WeatherEventType.Rain, Severity = Severity.Light, StartTime = DateTime.Now }; string file_path = "../../../Data.csv"; List <WeatherEvent> arr = new List <WeatherEvent>(); using (StreamReader sr = new StreamReader(file_path)) { sr.ReadLine(); while (!sr.EndOfStream) { string inp = sr.ReadLine(); arr.Add(new WeatherEvent(inp)); } } #region 0. Linq - сколько различных городов есть в датасете Console.WriteLine("0. сколько различных городов есть в датасете"); var cityCnt1 = arr.GroupBy(elem => elem.City).Count(); Console.WriteLine(cityCnt1); var cityCnt2 = (from elem in arr group elem by elem.City).Count(); Console.WriteLine(cityCnt2); #endregion #region 1.Сколько записей за каждый из годов имеется в датасете. Console.WriteLine("\n1.Сколько записей за каждый из годов имеется в датасете."); var entryPerYear1 = arr .GroupBy(elem => elem.StartTime.Year) .Select(g => new { Year = g.Key, Quantity = g.Count() }); entryPerYear1.PrintCollection(); Console.WriteLine(new string('-', 5)); var entryPerYear2 = from elem in arr group elem by elem.StartTime.Year into yearGroup select new { Year = yearGroup.Key, Quantity = yearGroup.Count() }; entryPerYear2.PrintCollection(); #endregion #region 2. Вывести количество зафиксированных природных явлений в Америке в 2018 году Console.WriteLine("\n2.Вывести количество зафиксированных природных явлений в Америке в 2018 году"); var typeCnt1 = arr .Where(elem => elem.StartTime.Year == 2018) .GroupBy(elem => elem.Type) .Count(); var typeCnt2 = (from elem in arr where elem.StartTime.Year == 2018 group elem by elem.Type).Count(); var TypeInfo = from elem in arr where elem.StartTime.Year == 2018 group elem by elem.Type into g select new { WeatherEventType = g.Key, Quantity = g.Count() }; Console.WriteLine(typeCnt1); Console.WriteLine(typeCnt2); TypeInfo.PrintCollection(); #endregion #region 3.Вывести топ 3 самых дождливых города в 2019 году в порядке убывания количества дождей (вывести город и количество дождей) Console.WriteLine("\n3.Вывести топ 3 самых дождливых города в 2019 году в порядке убывания количества дождей"); var rainCities1 = arr .Where(elem => elem.StartTime.Year == 2019 && elem.Type == WeatherEventType.Rain) .GroupBy(elem => elem.City) .Select(g => new { City = g.Key, Quantity = g.Count() }) .OrderByDescending(pair => pair.Quantity) .Take(3); var rainCities2 = (from elem in arr where elem.StartTime.Year == 2019 && elem.Type == WeatherEventType.Rain group elem by elem.City into g select new { City = g.Key, Quantity = g.Count() } into pair orderby pair.Quantity descending select pair).Take(3); rainCities1.PrintCollection(); Console.WriteLine(new string('-', 5)); rainCities2.PrintCollection(); #endregion #region 4.Вывести данные самых долгих (топ-1) снегопадов в Америке по годам (за каждый из годов) - с какого времени, по какое время, в каком городе Console.WriteLine("4.Вывести данные самых долгих снегопадов в Америке по годам"); var longSnowCol1 = arr .Where(elem => elem.Type == WeatherEventType.Snow) .GroupBy(elem => elem.StartTime.Year) .Select(g => g.OrderByDescending(elem => elem.EndTime - elem.StartTime)) .Select(g => new { g.First().StartTime.Year, g.First().StartTime, g.First().EndTime, g.First().City }); var longSnowCol2 = from elem in arr where elem.Type == WeatherEventType.Snow group elem by elem.StartTime.Year into gr select gr.OrderByDescending(elem => elem.EndTime - elem.StartTime) into g let f = g.First() select new { f.StartTime.Year, f.StartTime, f.EndTime, f.City }; longSnowCol1.PrintCollection(); Console.WriteLine(new string('-', 5)); longSnowCol2.PrintCollection(); #endregion }
static void Main(string[] args) { List <WeatherEvent> data = new List <WeatherEvent>(); // Нужно дополнить модель WeatherEvent, создать список этого типа List<> // И заполнить его, читая файл с данными построчно через StreamReader // Ссылка на файл https://www.kaggle.com/sobhanmoosavi/us-weather-events // Написать Linq-запросы, используя синтаксис методов-расширений // и продублировать его, используя синтаксис запросов // (возможно с вкраплениями методов расширений, ибо иногда первого может быть недостаточно) // 0. Linq - сколько различных городов есть в датасете. // 1. Сколько записей за каждый из годов имеется в датасете. // Потом будут еще запросы string path = "C:\\Users\\Tim\\shit\\Desktop\\lessons\\seminars\\30.01.21\\30.01.21\\semLinqTask\\WeatherEvents_Jan2016-Dec2020.csv"; //string sup = "C:\\Users\\Tim\\shit\\Desktop\\1.txt"; using (StreamReader streamReader = new StreamReader(File.Open(path, FileMode.Open))) { streamReader.ReadLine(); while (!streamReader.EndOfStream) { string[] text = streamReader.ReadLine().Split(','); WeatherEvent weatherEvent = new WeatherEvent(); weatherEvent.EventId = text[0]; weatherEvent.Type = text[1] switch { "Snow" => WeatherEventType.Snow, "Rain" => WeatherEventType.Rain, "Cold" => WeatherEventType.Cold, "Fog" => WeatherEventType.Fog, "Precipitation" => WeatherEventType.Precipitation, "Hail" => WeatherEventType.Hail, "Storm" => WeatherEventType.Storm }; weatherEvent.Severity = text[2] switch { "Other" => Severity.Other, "UNK" => Severity.UNK, "Heavy" => Severity.Heavy, "Light" => Severity.Light, "Moderate" => Severity.Moderate, "Severe" => Severity.Severe }; weatherEvent.StartTime = DateTime.Parse(text[3]); weatherEvent.EndTime = DateTime.Parse(text[4]); weatherEvent.TimeZone = text[5] switch { "US/Mountain" => TimeZoneInfo.FindSystemTimeZoneById("US Mountain Standard Time"), "US/Pacific" => TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"), "US/Central" => TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"), "US/Eastern" => TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time"), }; weatherEvent.AirportCode = text[6]; weatherEvent.LocationLat = double.Parse(text[7]); weatherEvent.LocationLng = double.Parse(text[8]); weatherEvent.City = text[9]; weatherEvent.County = text[10]; weatherEvent.State = text[11]; try { weatherEvent.ZipCode = int.Parse(text[12]); } catch { weatherEvent.ZipCode = null; } data.Add(weatherEvent); } } // Task 0 //var cities = new List<string>(data.Select(element => element.City).Distinct()); //Console.WriteLine(cities.Count); // Task 1 var posts = data.GroupBy(info => info.EndTime.Year).Select(group => new { Year = group.Key, count = group.Count() }).OrderBy(x => x.Year); foreach (var post in posts) { Console.WriteLine($"{post.Year} {post.count}"); } } }
static void Main(string[] args) { //Нужно дополнить модель WeatherEvent, создать список этого типа List<> //И заполнить его, читая файл с данными построчно через StreamReader //Ссылка на файл https://www.kaggle.com/sobhanmoosavi/us-weather-events //Написать Linq-запросы, используя синтаксис методов расширений //и продублировать его, используя синтаксис запросов //(возможно с вкраплениями методов расширений, ибо иногда первого может быть недостаточно) //0. Linq - сколько различных городов есть в датасете. //1. Сколько записей за каждый из годов имеется в датасете. //2. Вывести данные самых долгих(топ - 1) снегопадов в Америке по годам(за каждый из годов) - с какого времени, по какое время, в каком городе //Потом будут еще запросы WeatherEvent we = new WeatherEvent() { EventId = "W-1", Type = WeatherEventType.Rain, Severity = Severity.Light, StartTime = DateTime.Now }; StreamReader sr = new StreamReader("../../../table.csv"); string curLine; List <WeatherEvent> weatherEvents = new List <WeatherEvent>(); sr.ReadLine(); while ((curLine = sr.ReadLine()) != null) { var props = curLine.Split(','); WeatherEvent curWe = new WeatherEvent() { EventId = props[0], Type = (WeatherEventType)(props[1])[0], Severity = (Severity)(props[2][0]), StartTime = DateTime.Parse(props[3].Replace(' ', 'T')), EndTime = DateTime.Parse(props[4].Replace(' ', 'T')), TimeZone = (TimeZone)(props[5])[3], AirportCode = props[6], // Делаю на русской локали приходится заменять LocationLat = double.Parse(props[7].Replace('.', ',')), LocationLng = double.Parse(props[8].Replace('.', ',')), City = props[9], Country = props[10], State = props[11], // Zipcode строка потому что где-то с 40080 коды становятся пустыми, потом опять возвращаются ZipCode = props[12] }; weatherEvents.Add(curWe); } Console.WriteLine($"0.Уникальных городов: {weatherEvents.Select(x => x.City).ToHashSet().Count}"); Console.WriteLine($"1.Сколько записей за года:"); var years = WeatherEvent.GetAllYears(weatherEvents); foreach (var e in years) { Console.WriteLine($"{e}: {WeatherEvent.GetYearAmount(weatherEvents, e)}"); } Console.WriteLine($"2.Топ снегопад за каждый год:"); foreach (var e in years) { Console.WriteLine($"{e}: {WeatherEvent.GetTopSnowfallByYear(weatherEvents, e)}"); } }