Files
sspai-100-hours-series-python/code/15/scalars.ipynb
2022-06-23 10:04:29 +08:00

1274 lines
71 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"test_add (__main__.TestVector) ... ok\n",
"test_distance (__main__.TestVector) ... ok\n",
"test_sub (__main__.TestVector) ... ok\n",
"\n",
"----------------------------------------------------------------------\n",
"Ran 3 tests in 0.002s\n",
"\n",
"OK\n"
]
},
{
"data": {
"text/plain": [
"<unittest.main.TestProgram at 0x10a8bd720>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import unittest\n",
"\n",
"\n",
"class Vector:\n",
" def __init__(self, x, y) -> None:\n",
" self.x = x\n",
" self.y = y\n",
"\n",
" def __repr__(self) -> str:\n",
" return f\"Vector<x={self.x}, y={self.y}>\"\n",
"\n",
" def __add__(self, other: \"Vector\"):\n",
" return Vector(self.x + other.x, self.y + other.y)\n",
"\n",
" def __sub__(self, other: \"Vector\"):\n",
" return Vector(self.x - other.x, self.y - other.y)\n",
"\n",
" @property\n",
" def props(self):\n",
" return self.x, self.y\n",
"\n",
" def distance(self, other: \"Vector\"):\n",
" result = (other.x ** 2 - self.x ** 2) + (other.y ** 2 - self.y ** 2)\n",
" return abs(result)\n",
"\n",
"\n",
"class TestVector(unittest.TestCase):\n",
"\n",
" def setUp(self) -> None:\n",
" self.vec_a = Vector(x=2, y=5)\n",
" self.vec_b = Vector(x=-1, y=2)\n",
"\n",
" def test_add(self):\n",
" result = self.vec_a + self.vec_b\n",
" self.assertTupleEqual(result.props, (1, 7))\n",
"\n",
" def test_sub(self):\n",
" result = self.vec_a - self.vec_b\n",
" self.assertTupleEqual(result.props, (3, 3))\n",
"\n",
" def test_distance(self):\n",
" result = self.vec_a.distance(self.vec_b)\n",
" self.assertEqual(result, 24)\n",
"\n",
"\n",
"unittest.main(argv=[\"\"], verbosity=2, exit=False)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"233"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.uint8(233)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"iinfo(min=0, max=255, dtype=uint8)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.iinfo(np.uint8)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"255"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.uint8(-1)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.uint8(256)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"37"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.uint8(23333)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.series.Series'>\n",
"RangeIndex: 5 entries, 0 to 4\n",
"Series name: None\n",
"Non-Null Count Dtype\n",
"-------------- -----\n",
"5 non-null int64\n",
"dtypes: int64(1)\n",
"memory usage: 168.0 bytes\n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"integers = pd.Series(list(range(1, 6)))\n",
"integers.info()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"numpy.int64"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(integers.at[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 时间序列相关的基础类型"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2021-01-01 00:00:00')"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Timestamp(\"2021-01-01\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2002-01-01 00:00:00')"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Timestamp(\"20020101\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2022-04-05 13:10:36')"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Timestamp(1649164236, unit=\"s\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2022-01-01 23:13:42')"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Timestamp(year=2022, month=1, day=1, hour=23, minute=13, second=42)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Timedelta('1 days 00:00:00')"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"delta = pd.Timestamp(\"20220102\") - pd.Timestamp(\"20220101\")\n",
"delta"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2022-01-01 00:00:00')"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Timestamp(\"20220102\") - delta"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2022-01-03 00:00:00')"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Timestamp(\"20220102\") + delta"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2021-01-01 00:00:00')"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"periods = pd.Period(\"2021Q4\", freq='Y')\n",
"periods.start_time"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2021-12-31 23:59:59.999999999')"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"periods.end_time"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>datetime</th>\n",
" <th>delta</th>\n",
" <th>periods</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2022-01-01</td>\n",
" <td>1 days 00:00:00</td>\n",
" <td>2021Q4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2022-01-02</td>\n",
" <td>0 days 01:00:00</td>\n",
" <td>2020Q1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" datetime delta periods\n",
"0 2022-01-01 1 days 00:00:00 2021Q4\n",
"1 2022-01-02 0 days 01:00:00 2020Q1"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ts = pd.DataFrame(\n",
" {\n",
" \"datetime\": [pd.Timestamp(\"20220101\"), pd.Timestamp(\"20220102\")],\n",
" \"delta\": [pd.Timedelta(\"1d\"), pd.Timedelta(\"1h\")],\n",
" \"periods\": [pd.Period(\"2021Q4\", freq=\"Q\"), pd.Period(\"20200301\", freq=\"Q\")],\n",
" }\n",
")\n",
"ts.head()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 2 entries, 0 to 1\n",
"Data columns (total 3 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 datetime 2 non-null datetime64[ns] \n",
" 1 delta 2 non-null timedelta64[ns]\n",
" 2 periods 2 non-null period[Q-DEC] \n",
"dtypes: datetime64[ns](1), period[Q-DEC](1), timedelta64[ns](1)\n",
"memory usage: 176.0 bytes\n"
]
}
],
"source": [
"ts.info()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 1\n",
"1 2\n",
"Name: datetime, dtype: int64"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ts[\"datetime\"].dt.day"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 0\n",
"1 3600\n",
"Name: delta, dtype: int64"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ts[\"delta\"].dt.seconds"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 4\n",
"1 1\n",
"Name: periods, dtype: int64"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ts[\"periods\"].dt.quarter"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"image/png": "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6OhoOnTogI15VUNijGHfvn2kp6fTsWNHX3dHKaWUqhYRISkuorpbFPqNagePxpifsaOGpX1dwTmPAY+V0f51Wec56elDq9XBzFRolgwBAeTn52vg2ICJCM2bN2fPnqqVN1BKKaX8TXJcOGmZDXvauvHuMJOVetR6Rw0cGzb9+1NKKdUYJMdHkL4/D1uOsWFqvMGjFghXSimllJ9Jjosgp6CY7ENFvu5KtTXO4DH/ABza32ALhF9zzTVMnz698gOVUkop1aC4az025Izrxhk8ZjmZ1lqmRymllFJ+5HC5ngZc67FxBo8eZXr8xcGDBzn77LPp168fvXv35v333+eRRx5hyJAh9O7dm4kTJ5a5/mHx4sWccsopDBo0iNGjR7Nzp62C9MILL5CSkkLfvn259NJL6/vtKKWUUqoajow8NtzgsUZFwv3W4ZHHDsc89fAXq1mz40CtvlxKmxgePLdXhcd8++23tGnThq+++gqA7OxsRo4cyd///ncArrzySr788kvOPffcw+cUFRVx22238dlnn9GyZUvef/99/u///o+pU6fyxBNP8PvvvxMaGkpWVlatvh+llFJK1Y2YsGCahQfryKPfyUyFkGgIj6v82HrSp08fZs2axb333stPP/1Es2bNmDNnDscddxx9+vTh+++/Z/Xq1Ueds379elatWsXIkSPp378/jz76KOnp6QD07duXyy+/nP/+978c3pJRKaWUUn4vOT6cbQ14zWPjjDrcZXrKKO9S2QhhXenWrRtLlizh66+/5m9/+xunn346kyZNYtGiRSQnJ/PQQw8dswOOMYZevXrx66+/HnO9r776irlz5/LFF1/w2GOPsXLlSg0ilVJKqQYgOS6C9Rk5vu5GtTXekUc/Wu8IsGPHDiIiIrjiiiu4++67WbJkCQAtWrQgNze3zOzq7t27s2fPnsPBY1FREatXr8blcpGWlsaIESN48sknyc7OJjc3t17fj1JKKaWqJzk+gvTMQ7hcDbPWY+McqspKhc4jfN2Lo6xcuZK7776bgIAAgoODeeWVV/j000/p3bs3rVu3ZsiQIcecExISwvTp07n99tvJzs6muLiYO++8k27dunHFFVeQnZ2NMYbbb7+d2NjY+n9TSimllKqy5LhwCktc7M4p8HVXqkUacoXzssRERZgDdwXDmU/BcTcCsHbtWnr27Onjnqma0r9H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",
"text/plain": [
"<Figure size 720x360 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import random\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"\n",
"random.seed(233)\n",
"\n",
"dt = pd.date_range(start=\"20200101\", end=\"20220101\", freq=\"D\").set_names(\"datetime\")\n",
"data = pd.DataFrame(\n",
" [random.randrange(100, 10000) for _ in range(len(dt))],\n",
" index=dt,\n",
" columns=[\"sales\"],\n",
")\n",
"\n",
"(\n",
" data.resample(\"1M\")\n",
" .sum()\n",
" .assign(\n",
" reversed=lambda df: (df.loc[::-1, \"sales\"] * 0.2 - 1000).values\n",
" )\n",
" .plot.line(\n",
" secondary_y=[\"reversed\"],\n",
" figsize=(10, 5),\n",
" )\n",
")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 类别类型"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"['a', 'a', 'a', 'b', 'c', 'd', 'd']\n",
"Categories (4, object): ['a', 'b', 'c', 'd']"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"values = list(\"aaabcdd\")\n",
"cat = pd.Categorical(values)\n",
"cat"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 7 entries, 0 to 6\n",
"Data columns (total 2 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 types 7 non-null category\n",
" 1 number 7 non-null int64 \n",
"dtypes: category(1), int64(1)\n",
"memory usage: 395.0 bytes\n"
]
}
],
"source": [
"import random\n",
"random.seed(233)\n",
"\n",
"\n",
"data = pd.DataFrame(\n",
" {\n",
" \"types\": cat,\n",
" \"number\": [random.randrange(1000, 10000) for n in range(len(cat))],\n",
" }\n",
")\n",
"data.info()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>number</th>\n",
" </tr>\n",
" <tr>\n",
" <th>types</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>a</th>\n",
" <td>18241</td>\n",
" </tr>\n",
" <tr>\n",
" <th>b</th>\n",
" <td>8931</td>\n",
" </tr>\n",
" <tr>\n",
" <th>c</th>\n",
" <td>4348</td>\n",
" </tr>\n",
" <tr>\n",
" <th>d</th>\n",
" <td>5040</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" number\n",
"types \n",
"a 18241\n",
"b 8931\n",
"c 4348\n",
"d 5040"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.set_index(\"types\").groupby(level=0).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## 兼容缺失值的基础数据类型"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.series.Series'>\n",
"RangeIndex: 5 entries, 0 to 4\n",
"Series name: None\n",
"Non-Null Count Dtype \n",
"-------------- ----- \n",
"4 non-null float64\n",
"dtypes: float64(1)\n",
"memory usage: 168.0 bytes\n"
]
}
],
"source": [
"integers = pd.Series([1, 2, None, 4, 5])\n",
"integers.info()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 1.0\n",
"1 2.0\n",
"2 NaN\n",
"3 4.0\n",
"4 5.0\n",
"dtype: float64"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"integers.head()"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"nan"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"integers.at[2]"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"numpy.float64"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(integers.at[2])"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 1\n",
"1 3\n",
"2 <NA>\n",
"3 2\n",
"4 5\n",
"dtype: Int64"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Series([1, 3, None, 2, 5], dtype=pd.Int64Dtype())\n",
"# pd.Series([1, 3, None, 2, 5], dtype=\"Int64\")"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 True\n",
"1 True\n",
"2 False\n",
"3 <NA>\n",
"4 <NA>\n",
"dtype: boolean"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Series([True, True, False, None, None], dtype=pd.BooleanDtype())\n",
"# pd.Series([True, True, False, None, None], dtype=\"boolean\")"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 Foo\n",
"1 <NA>\n",
"2 <NA>\n",
"3 Bar\n",
"4 Puf\n",
"dtype: string"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Series([\"Foo\", None, np.nan, \"Bar\", \"Puf\"], dtype=pd.StringDtype())\n",
"# pd.Series([\"Foo\", None, np.nan, \"Bar\", \"Puf\"], dtype=\"string\")"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 Foo\n",
"1 <NA>\n",
"2 <NA>\n",
"3 Bar\n",
"4 Puf\n",
"dtype: string"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Series([\"Foo\", None, np.nan, \"Bar\", \"Puf\"], dtype=\"str\").astype(pd.StringDtype())"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"dtypes = pd.DataFrame(\n",
" [\n",
" pd.Series([1, 3, None, 2, 5], name=\"integer\"),\n",
" pd.Series([True, True, False, None, None], name=\"boolean\"),\n",
" pd.Series([\"Foo\", None, \"\", \"Bar\", \"Puf\"], name=\"string\")\n",
" ]\n",
").transpose()"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 5 entries, 0 to 4\n",
"Data columns (total 3 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 integer 4 non-null object\n",
" 1 boolean 3 non-null object\n",
" 2 string 4 non-null object\n",
"dtypes: object(3)\n",
"memory usage: 248.0+ bytes\n"
]
}
],
"source": [
"dtypes.info()"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 5 entries, 0 to 4\n",
"Data columns (total 3 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 integer 4 non-null Int64 \n",
" 1 boolean 3 non-null boolean\n",
" 2 string 4 non-null string \n",
"dtypes: Int64(1), boolean(1), string(1)\n",
"memory usage: 223.0 bytes\n"
]
}
],
"source": [
"(\n",
" dtypes.astype(\n",
" {\n",
" \"integer\": pd.Int64Dtype(),\n",
" \"boolean\": pd.BooleanDtype(),\n",
" \"string\": pd.StringDtype(),\n",
" }\n",
" )\n",
" .info()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.10.4 ('sspai-100-hours-series-python')",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.4"
},
"vscode": {
"interpreter": {
"hash": "7a101baf08afe636412f97dd4a9fc2e65b6f84f0ec50413bf3e19b04a26b8ba6"
}
}
},
"nbformat": 4,
"nbformat_minor": 0
}