
Yesterday you ran a complete data science workflow on toolik_weather.csv. You imported it, summarized it, plotted it, and exported a result. At no point did anyone ask you what was actually in that file.
Today you find out.
What is a data biography?
A data biography is a short written account of a dataset: where it came from, what it covers, what shape itβs in, and what a reader needs to know before trusting anything computed from it. Working data scientists write these constantly, usually in the first cells of a notebook, because the alternative is discovering a problem after youβve built an analysis on top of it.
Your deliverable today is a biography of the Toolik weather data, written in your notebook as markdown, with code cells showing the evidence for every claim you make.
This is the important part: every statement in your biography must be backed by a cell that produced it. Not βthe data covers about thirty years,β but βthe data covers 1988 to 2018,β with the cell that told you so sitting right above it.
Setup
Create a new notebook named
EOD_Day2_Data_Biography.ipynb.Add a title cell:
# Day 2 EOD: A Data Biography of Toolik Field Station Weather
Date: 09/01/2026- Import pandas and read the data:
The file is at:
https://eds-217-essential-python.github.io/data/toolik_weather.csvToolik Field Station sits on the North Slope of Alaska, above the Arctic Circle, and is part of the Arctic Long Term Ecological Research (LTER) network. It has been collecting daily weather since the late 1980s. Keep that context in mind: it should make some of the numbers you find look reasonable, and it should make others look suspicious.
Part 1: Vital statistics
Answer each of these with code, then write the answer in a markdown cell beneath it.
- How many rows and how many columns does the dataset have?
- What are the column names? Get them as a Python list.
- What is the data type of each column?
- What years does the record cover? (You can read the earliest and latest year off
.describe().)
Look closely at the Date columnβs data type. Does it match what youβd expect a date to be? Say what pandas has actually stored there. You donβt need to fix it, and weβll handle dates properly on Day 6.
Part 2: The health check
- Run
.info(). How many columns have fewer non-null values than there are rows? - Use
.isnull().sum()to count missing values per column. Which three columns are the emptiest? - One of the flag columns is missing a value in all but a handful of rows. Which one, and how many values does it actually have?
A column that is 99% empty is not necessarily broken. Think about what a βflagβ column is for in an environmental dataset, and offer a sentence explaining why it might be mostly empty by design. This is the difference between reading a table and understanding a dataset.
Part 3: What varies, and what doesnβt
- Use
.value_counts()onLTER_Siteand onStation. What do you learn? Is either column carrying information? - Use
.value_counts()onFlag_Daily_AirTemp_Mean_C. What values appear, and what do you think they mean? - Use
.value_counts()on theYearcolumn and look at both ends of the result, with.head()and then with.tail(). Do all years have the same number of observations? What would explain a year with fewer?
Part 4: The numbers
- What is the mean daily air temperature across the whole record? The minimum? The maximum?
- Are those values plausible for a site above the Arctic Circle? Say why or why not.
- Pick one other numeric column and report its range. Does anything about it look wrong?
.describe() will average anything you point it at. Before you report a mean, satisfy yourself that the column holds one kind of thing, measured one way.
Part 5: A tidier table
- Build a list of the five columns youβd keep if you had to hand this dataset to a colleague who only cared about temperature. Use it to make a smaller DataFrame.
- Build a dictionary that renames at least two of those columns to something shorter and clearer. Apply it with
.rename(columns=...)and confirm the new names.
Part 6: Write the biography
In a single markdown cell, write 200 to 300 words covering:
- What this dataset is. Source, station, what is measured, at what frequency.
- Coverage. How many rows, what time span, how many variables.
- Condition. Whatβs missing and where. Which columns you would and would not trust.
- Cautions. Two specific things a person using this data should know before computing anything from it.
- Fitness for purpose. Could you use this to describe how Arctic summer temperatures have changed since 1988? Say yes or no, and say what would need checking first.
Write it for a colleague who has never opened the file. No bullet fragments; complete sentences.
If youβd like to check several columns at once rather than one at a time, you can loop over a list. We cover loops properly in this afternoonβs live-coding session, so here is the whole pattern. Adapt the list, donβt write the loop from scratch:
for column_name in ['Daily_AirTemp_Mean_C', 'Daily_Precip_Total_mm']:
print(column_name, toolik[column_name].isnull().sum())This is optional. Everything above can be done one column at a time.
Wrap-up
Before you close your notebook, check that:
- every factual claim in your biography has a code cell above it that produced the evidence
- your notebook reads top to bottom as a document, not as a pile of cells
- you have used at least one list and at least one dictionary
- you noticed at least one thing about this dataset that would have caused a problem if you hadnβt looked
That last one is the whole point of today.