use polars_core::prelude::*; use anyhow::{Result, anyhow};
mod request;
mod parser;
async fn get_raw_snp() -> Result<String> {
let endpoint = "https://en.wikipedia.org/w/api.php";
let action = "query";
let format = "json";
let prop = "revisions";
let titles = "List_of_S%26P_500_companies"; let format_version = "2";
let rvprop = "content";
let rvslots = "*";
let url = format!(
"{}?action={}&format={}&prop={}&titles={}&formatversion={}&rvprop={}&rvslots={}",
endpoint, action, format, prop, titles, format_version, rvprop, rvslots
);
let client = reqwest::Client::new();
let page_data = request::make_request(&url, client).await.unwrap();
Ok(page_data)
}
pub mod group {
use polars::prelude::GroupBy;
use super::*;
pub fn by_sector (data: &DataFrame) -> GroupBy {
let grouped = data.groupby(["sector"])
.expect("grouping failure");
grouped
}
}
pub mod fetcher {
use super::*;
pub async fn snp_data() -> Result<DataFrame> {
let raw_data_res = get_raw_snp().await;
let mut raw_data = String::new();
match raw_data_res {
Ok(val) => {
raw_data = val;
}
Err(e) => {
return Err(anyhow!(format!("Error fetching: {}",e)));
}
}
let snp_data = parser::parse_snp(&raw_data)
.expect("Error creating dataframe");
Ok(snp_data)
}
}
use tokio::task;
use tokio_test::block_on;
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn get_raw_data() {
let res = get_raw_snp().await
.expect("Error getting raw Data");
assert!(res.len()>0);
}
#[tokio::test]
async fn parse() {
let raw_data = get_raw_snp().await
.expect("Error getting raw data");
let formatted = parser::parse_snp(&raw_data)
.expect("Error formatting");
let num_of_constituants = 503;
assert!(formatted.shape().0 == num_of_constituants);
assert_eq!(formatted.get_column_names(), ["symbol", "sector", "industry", "date_added", "cik"])
}
}